2011-06-15 13 views
10
constexpr int get() { return 5; } 
template<int N> struct Test {}; 

int main() 
{ 
    int a[get()]; // ok 
    Test< get() > obj; // error:'int get()' cannot appear in a constant-expression 
} 

Mam compiled this code with ideone. Zastanawiam się, dlaczego powoduje błąd kompilacji. Czy funkcja constexpr jest niedozwolona jako argument template lub jest to błąd w kompilatorze?Czy można użyć funkcji constexpr jako argumentu szablonu?

Edit: zmienił const int get() do int get() Ponadto istnieje jeszcze jedna bug z ideone jest to, że jeśli usuniesz constexpr następnie still declaring an array is allowed !! Myślę, że to funkcja C99.

+0

Twoja edycja jest niepoprawna, stworzyłeś 'constexpr const get()'. – GManNickG

+0

@GMan, dziękuję ... – iammilind

+3

W edycji, to jest funkcja C99, a gcc ma ją jako rozszerzenie, ale nie jest to właściwe C++ i nie będzie przenośne. Zostało ono uwzględnione w standardzie i odrzucone, ponieważ złamałoby niezmiennik, że typy (rozmiar jest częścią typu) muszą być znane podczas kompilacji. W C nie ma to większego znaczenia, ale w C++ nie byłbyś w stanie użyć tej tablicy jako argumentu typu do szablonu (dokładny typ nieznany w czasie kompilacji) - co jest przy okazji zachowaniem w gcc, będzie narzekać, jeśli spróbujesz to zrobić. –

Odpowiedz

13

GCC 4.5 (przynajmniej wersja użyta w Ideone) nie obsługuje w pełni constexpr, w tym waszego prawidłowego użycia; podlewa się do const. GCC 4.6 i nowsze poprawnie go obsługują.