2016-07-30 19 views
0

Visual Studio 2015 Update 3.Warum kann ich den Parameter der einfachen constexpr-Funktion nicht erhöhen?

Ich lese die Programmierung. Prinzipien und Praxis mit C++ (zweite Ausgabe) von Bjarne Stroustrup. Ich lerne die constexpr Funktionen ...

Es funktioniert:

constexpr int get_value(int n) { 
    return n + 1; 
} 

Aber ich kann das nicht kompilieren (anstelle der ersten Variante):

constexpr int get_value(int n) { 
    return ++n; 
} 

ich den Fehler:

constexpr function return is non-constant

die n ist die lokale Variable für die get_value Funktion. I.e. n Variable Änderung hat keinen Einfluss auf externen Code.

Warum ist die zweite Variante der get_value Funktion falsch?

+2

Versuchen Sie einen richtigen Compiler. – Columbo

+0

Ich habe in 'Codeblock' mit' g ++ 5.3.1' getippt und bearbeitet. –

+0

@ k-five, Hm ... Vielleicht ist mein Problem spezifisch für IDE, die ich verwende ... –

Antwort

3

Der zweite ist nicht erlaubt in C++ 11 constexpr. Der Standard hatte sogar ein sehr ähnliches Beispiel (N3337 [dcl.constexpr]/3):

constexpr int prev(int x) 
{ return --x; } // error: use of decrement 

N3337 [expr.const]/2 ausdrücklich verbietet "Zunahme oder -abnahme operations" in konstanten Ausdrücken.

C++ 14 erweiterte constexpr entspannt diese Anforderungen, aber MSVC implementiert das nicht.

+0

Hm ... warum wurde es verboten? Welche Gefahr drin? –

+0

@AndreyBushman: Keine Gefahr, nur Reinheit der Spezifikation: _no mutation allowed_. Die Einschränkung verschwindet mit C++ 14, weil sie im Allgemeinen Mutation erlaubt, nicht nur weil Inkrement- und Dekrement-Operationen nicht länger herausgegriffen werden. – ildjarn

2

Die zweite ist unter C++ 14 legal, aber es kompiliert nicht, da Visual Studio 2015 nur teilweise Unterstützung für constexpr Funktionen hat. Es hat nur Unterstützung für Single Return constexpr Funktionen und andere Einschränkungen (wie Ihre), die in C++ 11 wirksam waren.

Siehe this Artikel (in der constexpr Absatz). Visual Studio "15" bringt Verbesserungen an constexpr Funktionen. Sie müssen etwas warten :)