2015-12-03 12 views
6

Betrachten der CodeDefinition unterscheidet sich von Deklaration für constexpr statischen Element

#include <iostream> 

struct Foo 
{ 
    constexpr static int n = 42; 
}; 

const int Foo::n; // note const, NOT constexpr 

int main() 
{ 
    std::cout << Foo::n; 
} 

Die Definition des statischen Element aus der Erklärung in Klasse unterscheidet, d.h. const verwendet wird anstelle von constexpr. Ist der obige Code legal und wenn ja, warum? Es kompiliert sowohl mit gcc als auch mit clang. Es kompiliert auch, wenn wir in der Definition und Deklaration const und constexpr vertauschen. Ich weiß, dass constexprconst auf Variablen bedeutet, aber nicht umgekehrt.

Antwort

1

Meine zwei Cent, beim Betrachten einiger Dokumentation wie that one.

Eigentlich könnte es gültig sein.

Tatsächlich beruht der Unterschied zwischen constexpr und const hauptsächlich auf ihren Zweck, aber Ersteres impliziert Letzteres als Nebeneffekt.

Es gibt auch einen subtilen Unterschied: constexpr ein Spezifizierer, während const ist ein Qualifier.

Insbesondere:

const primäre Funktion ist es, die Idee auszudrücken, dass ein Objekt nicht durch eine Schnittstelle

Auf der anderen Seite modifiziert wird:

primäre Funktion constexpr die ist, den Bereich dessen, was zur Kompilierungszeit berechnet werden kann, zu erweitern, wodurch ein solcher Berechnungstyp sicher und auch in Kompilierungskontexten verwendbar ist

Oder noch prägnanter aus here:

constexpr - gibt an, dass der Wert einer Variablen oder Funktion in konstanten Ausdrücken

geschieht jeden Fall erscheinen kann, dass:

consExpr vor einer Variablen-Definition [...] bedeutet const

So 210

, auch wenn der Grund für die sollte man constexpr statt const zu verwenden ist klar, und jeder dazu neigt, sich daran zu erinnern, dass:

constexpr ist kein Allzweck-Ersatz für konst (oder umgekehrt)

Es ist eine Tatsache, dass constexpr verwenden Sie sagen eigentlich, dass dieses Mitglied implizit const ist (auch Sie haben eine Reihe von spezifischeren Einschränkungen, wie das Element definiert werden).

Wie auch immer, sobald es definiert ist, ist das Mitglied nicht mehr als ein Datenelement mit dem Qualifikationsmerkmal const (das in konstanten Ausdrücken verwendet werden kann), was Sie aus Ihrer Klasse deklarieren.

Verwandte Themen