2016-09-04 3 views
1

Ich habe ein sehr einfaches Projekt, das seltsame Verhalten in VS2015 produziert:Fehler: Ausdruck muss konstanten Wert haben. Für eine deutlich Konstante Wert

#include "Vec2f.h" 
#include "StaticRendercomponent.h" 

int main(int argc, char** argv) 
{ 
    constexpr Vec2f position(0.0f, 0.0f); 
    constexpr PhysicsComponent component(position, 15.0f); 

    return 0; 
} 

VS2015 wird Hervorhebung der position Argument im Konstruktor in rot. Nach über die Markierung mousing, erscheint die Meldung:

constexpr Vec2f position = {(0.0f), (0.0f)} 

expression must have constant value 

Im Gegensatz zur Fehlerhervorhebung und die Meldung, das Programm kompiliert und läuft ohne Probleme und ohne Nachrichten im Buildprotokoll, mit Warnstufe 4 und " Warnungen als Fehler behandeln "aktiv.

Dass VS einen solchen Fehler anzeigt und mit der Kompilierung meines Programms fortfährt, ohne dass die Nachricht im Buildprotokoll angezeigt wird, ist ... verwirrend, um es gelinde auszudrücken.

Warum wird diese Nachricht angezeigt?
Warum wird die Kompilierung und Ausführung der Anwendung nicht gestoppt?

die Verdächtigen

Vec2f der Constructor:

constexpr Vec2f::Vec2f(const float x, const float y) noexcept: 
    x(x), 
    y(y) 
{ 
} 

Der PhysicsComponent Constructor:

constexpr PhysicsComponent::PhysicsComponent(Vec2f position, float mass, Vec2f momentum) noexcept: 
    current(position, mass, momentum), 
    previous(current), 
    interpolated(current) 
{ 
} 

die drei Datenelemente "current", "vorherigen" und "interpoliert" sind von der Typ PhysicsState, dessen Konstruktor unter

01 beschrieben wird

Die Signatur von computeInverse ist wie folgt:

template<typename T> 
constexpr T computeInverse(T value) noexcept 

Ich fragte mich immer noch, wenn der PhysicsStates nicht erfolgreich war constexpr vom Compiler aufgrund des Aufruf computerInverse() initialisiert wird, aber das Hinzufügen der Zeile:

constexpr PhysicsState test(position, 15.0f); 

Um main() kompiliert und läuft ohne Nachrichten UND keine Hervorhebung.
Jeder Einblick in dieses Problem würde sehr geschätzt werden.

+2

IntelliSense ist weit davon entfernt, perfekt zu sein. Nie war und wird es auch nie sein. Wenn Sie gemischte Nachrichten erhalten, vertrauen Sie dem Compiler. – molbdnilo

+0

Ah, ich denke, nicht ganz so interessant, wie ich gehofft hatte, die Antwort wäre ... Aber leider scheint die einfachste und wahrscheinlichste Erklärung, die ich übersehen habe – loaner9

+0

IntelliSense ist eine * Simulation * eines Compilers. Es ist oft falsch (wie Sie sehen können). Ignoriere es. – rustyx

Antwort

2

Ignorieren Sie intellisense, wenn es kompiliert. Es spuckt manchmal nur falsche Warnungen aus.

Verwandte Themen