Nie ma gwarancji, że wyrażenia stałe zostaną ocenione w czasie kompilacji, mamy tylko nienormatywny cytat z wersji roboczej C ++ sekcji standardowej 5.19
Wyrażenia stałe, który mówi tak:
[...]> [Uwaga: wyrażenia stałe można oceniać podczas tłumaczenia. — uwaga końcowa]
Możesz przypisać wynik do constexpr
zmiennej, aby upewnić się, że jest ona oceniana w czasie kompilacji, możemy to zobaczyć z referencji C ++ 11 Bjarne Stroustrupa, która mówi ( wyróżnienie moje ):
Oprócz możliwości oceny wyrażeń w czasie kompilacji, chcemy móc wymagać, aby wyrażenia były oceniane w czasie kompilacji; constexpr przed definicją zmiennej robi to (i implikuje const):
Na przykład:
constexpr int len1 = length("abcd") ;
Bjarne Stroustrup podaje podsumowanie, kiedy możemy zapewnić ocenę czasu kompilacji w tym wpisie na blogu isocpp i mówi:
[...] Prawidłową odpowiedzią - jak stwierdził Herb - jest to, że zgodnie ze standardem funkcja constexpr może być oceniana w czasie kompilacji lub w czasie wykonywania, chyba że jest używana jako wyrażenie stałe, w którym to przypadku musi być oceniana podczas kompilacji -czas. Aby zagwarantować ocenę czasu kompilacji, musimy użyć go tam, gdzie wymagane jest stałe wyrażenie (np. Jako powiązana tablica lub jako etykieta przypadku) lub użyć go do zainicjowania constexpr. Mam nadzieję, że żaden szanujący się kompilator nie przegapi okazji do optymalizacji, aby zrobić to, co pierwotnie powiedziałem: „Funkcja constexpr jest oceniana w czasie kompilacji, jeśli wszystkie jej argumenty są wyrażeniami stałymi”.
To przedstawia dwa przypadki, w których powinno się to oceniać w czasie kompilacji:
- Użyj go tam, gdzie wymagane jest stałe wyrażenie, wydaje się, że znajduje się ono w dowolnym miejscu w standardowym projekcie, w którym fraza
shall be ... converted constant expression
lub shall be ... constant expression
jest używana, na przykład w powiązaniu z tablicą.
- Użyj go, aby zainicjować,
constexpr
jak opisałem powyżej.