Постійні вирази не гарантовано обчислюються під час компіляції, ми маємо лише ненормативну цитату з проекту стандартного розділу C ++, 5.19
Постійні вирази, де це сказано:
[...]> [Примітка: Постійні вирази можна обчислювати під час перекладу - кінцева примітка]
Ви можете призначити результат constexpr
змінній, щоб переконатися, що він обчислюється під час компіляції, ми можемо побачити це з посилання на Bjarne Stroustrup C ++ 11, в якому сказано ( наголос мій ):
Окрім того, що ми можемо оцінювати вирази під час компіляції, ми хочемо мати можливість вимагати, щоб вирази оцінювались під час компіляції; constexpr перед визначенням змінної робить це (і передбачає const):
Наприклад:
constexpr int len1 = length("abcd") ;
Bjarne Stroustrup дає короткий опис того, коли ми можемо забезпечити компіляцію оцінки часу в цьому записі в блозі isocpp, і каже:
[...] Правильна відповідь - як зазначив Herb - полягає в тому, що згідно зі стандартом функція constexpr може оцінюватися під час компілятора або під час виконання, якщо вона не використовується як константний вираз, і в цьому випадку вона повинна бути оцінена під час компіляції -час. Щоб гарантувати оцінку часу компіляції, ми мусимо використовувати його там, де потрібен константний вираз (наприклад, як масив, прив'язаний або як мітку справи), або використовувати для ініціалізації constexpr. Я сподівався б, що жоден поважаючий себе компілятор не пропустить можливості оптимізації, щоб зробити те, що я спочатку сказав: "Функція constexpr оцінюється під час компіляції, якщо всі її аргументи є постійними виразами".
Отже, це окреслює два випадки, коли його слід оцінювати під час компіляції:
- Використовуйте його там, де потрібен константний вираз, здається, це десь у проекті стандарту, де використовується фраза
shall be ... converted constant expression
або shall be ... constant expression
, наприклад, пов’язаний масив.
- Використовуйте його для ініціалізації а,
constexpr
як я зазначив вище.