constexpr inicjujący element statyczny za pomocą funkcji statycznej
Chcęconstexpr
wartość (tj. stała czasu kompilacji) obliczona z aconstexpr
funkcjonować. I chcę, aby oba te zakresy obejmowały przestrzeń nazw klasy, tj. Metodę statyczną i statyczny element klasy.
Najpierw napisałem to (dla mnie) oczywisty sposób:
class C1 {
constexpr static int foo(int x) { return x + 1; }
constexpr static int bar = foo(sizeof(int));
};
g++-4.5.3 -std=gnu++0x
mówi do tego:
error: ‘static int C1::foo(int)’ cannot appear in a constant-expression
error: a function call cannot appear in a constant-expression
g++-4.6.3 -std=gnu++0x
skarży się:
error: field initializer is not constant
Drugie podejścieOK, pomyślałem, może muszę przenieść rzeczy z ciała klasy. Próbowałem więc:
class C2 {
constexpr static int foo(int x) { return x + 1; }
constexpr static int bar;
};
constexpr int C2::bar = C2::foo(sizeof(int));
g++-4.5.3
skompiluje to bez skarg. Niestety, mój inny kod wykorzystuje niektóre oparte na zakresiefor
pętle, więc muszę mieć przynajmniej 4.6. Teraz, gdy przyjrzę się bliżejlista wsparcia, wygląda na to, żeconstexpr
wymagałoby również 4.6. I zg++-4.6.3
dostaję
3:24: error: constexpr static data member ‘bar’ must have an initializer
5:19: error: redeclaration ‘C2::bar’ differs in ‘constexpr’
3:24: error: from previous declaration ‘C2::bar’
5:19: error: ‘C2::bar’ declared ‘constexpr’ outside its class
5:19: error: declaration of ‘const int C2::bar’ outside of class is not definition [-fpermissive]
To brzmi dla mnie naprawdę dziwnie. Jak rzeczy się „różniąconstexpr
”Tutaj? Nie chcę dodawać-fpermissive
ponieważ wolę, aby mój inny kod był rigurycznie sprawdzany. Przesuwaniefoo
implementacja poza klasą ciała nie miała widocznego efektu.
Czy ktoś może wyjaśnić, co tu się dzieje? Jak mogę osiągnąć to, co próbuję zrobić? Interesują mnie głównie odpowiedzi następujących rodzajów:
Sposób na wykonanie tej pracy w gcc-4.6Obserwacja, że późniejsze wersje gcc mogą poprawnie obsłużyć jedną z wersjiWskaźnik do specyfikacji, według którego przynajmniej jedna z moich konstrukcjipowinien działam, więc mogę błąd programistów gcc, aby rzeczywiście go uruchomićInformacja, że to, czego chcę, jest niemożliwe zgodnie ze specyfikacjami, najlepiej z pewnym zuchwałością co do uzasadnienia tego ograniczeniaInne przydatne odpowiedzi są również mile widziane, ale być może nie zostaną zaakceptowane tak łatwo.