2014-04-13 33 views
8

Próba utworzenia elementu struct z atrybutem constexpr bez statycznego skutkuje błędem kompilatora (patrz poniżej). Dlaczego? dla pojedynczej stałej wartości mam tę wartość w pamięci, aż program zostanie zakończony zamiast tylko zakresu struct? powinienem wrócić do korzystania z makra?Dlaczego constexpr musi być statyczny?

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

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

Cóż, skopiowanie go nie miałoby większego sensu. – Ben

+1

Znacznie lepiej raz w pamięci statycznej niż wiele razy, po jednym w każdym wystąpieniu struktury. – chris

+2

Dlaczego miałbyś mieć kopię "constexpr" dla każdego obiektu? –

Odpowiedz

12

Nie znam oficjalnej racjonalności. Ale na pewno może to doprowadzić do zamieszania. Z jednej strony nie widzę, co to znaczy, że niestatyczny element danych ma być constexpr. Czy jesteś w stanie wykonać następujące czynności?

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

A to oznacza, że ​​inicjator musi być stała zawsze, to znaczy, że nie wolno napisać wyżej (bo n nie jest stała/potencjalnie mogłyby nie stała), ale wolno powiedzieć

foo f = { 10 }; 

Reguła, że ​​constexpr int n jest po prostu źle sformułowana, a nie jest domyślnie static wydaje mi się dobra, ponieważ jej semantyka nie byłaby jasna IMO.

+0

Nie widzę nic złego w 'constexpr int n = 10' ponieważ jest to typ integralny, każde użycie' n' podczas kompilacji powinno zostać zastąpione jego wartością podobnie jak w przypadku 'define'. Składnia jest całkiem jasna, nie rozumiem, dlaczego standard na to nie pozwala. –

Powiązane problemy