2014-04-13 21 views
8

Ein Versuch, ein Mitglied eines struct mit constexpr Attribute zu erzeugen, ohne statisches Ergebnis in einem Compiler-Fehler zu sein (siehe unten). Warum das? Für einen einzelnen konstanten Wert habe ich diesen Wert im Speicher, bis das Programm terminiert ist und nicht nur der Bereich von struct? Soll ich ein Makro verwenden?Warum muss conexpr statisch sein?

struct foo 
{ 
    constexpr int n = 10; 
    // ... 
}; 

error: non-static data member cannot be constexpr; did you intend to make it static? 
+0

Nun, es zu kopieren würde nicht viel Sinn machen. – Ben

+1

Viel besser einmal im statischen Speicher als viele Male, eine in jedem Fall der Struktur. – chris

+2

Warum sollten Sie für jedes Objekt eine Kopie von "constexpr" haben? –

Antwort

12

Ich kenne die offizielle rationale nicht. Aber sicherlich könnte es zu Verwirrung führen. Ich kann zum ersten Mal nicht sehen, was es für ein nicht statisches Datenmitglied bedeutet, constexpr zu sein. Können Sie Folgendes tun?

struct foo { 
    constexpr int n = 10; 
    constexpr foo() { } 
    constexpr foo(int n):n(n) { } // overwrite value of n 
}; 

Oder bedeutet es, dass die initializer immer konstant sein muss, dh Sie sind nicht erlaubt, die oben zu schreiben (weil n nicht konstant ist/könnte möglicherweise nicht konstanten) aber erlaubt

foo f = { 10 }; 
zu sagen

Die Regel, dass constexpr int n ist einfach schlecht gebildet statt implizit static scheint mir gut, da seine Semantik IMO nicht klar wäre.

+0

Ich sehe nichts falsch mit 'constexpr int n = 10', wie es einem integralen Typ ist, sollte jede Verwendung von' n' während der Kompilierung mit seinem Wert ersetzt werden wie im Fall von 'define'. Die Syntax ist ziemlich klar, ich verstehe nicht, warum der Standard es nicht erlaubt. –

Verwandte Themen