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.
Twoja edycja jest niepoprawna, stworzyłeś 'constexpr const get()'. – GManNickG
@GMan, dziękuję ... – iammilind
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ć. –