constexpr inicjujący element statyczny za pomocą funkcji statycznej

Wymagania

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.

Pierwsze podejscie

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ście

OK, 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.

Oczekiwane odpowiedzi

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 ograniczenia

Inne przydatne odpowiedzi są również mile widziane, ale być może nie zostaną zaakceptowane tak łatwo.

questionAnswers(4)

yourAnswerToTheQuestion