Страницы

Поиск по вопросам

суббота, 1 июня 2019 г.

Как убедиться, что constexpr действительно вычисляется во время компиляции?

Очередной чисто теоретический вопрос - а как убедиться, что constexpr действительно вычисляется во время компиляции? Похоже, что по крайней мере Visual C++, не сумев справиться с constexpr-функцией, никак об этом не сообщает.
Как паллиатив для целочисленного результата можно применить класс-повторилку, типа
template struct val { static int const value = N; };
и тогда для
constexpr int complexFunc(){...}
результат использовать как
val::value
Но это и громоздко, и ограниченно пригодно...


Ответ

constexpr гарантирует что функция может быть вызвана на этапе компиляции, если она вызвана в контексте, в котором разрешены только выражения времени компиляции - параметры шаблона, constexpr переменные, другие constexpr функции, размер массива, целочисленные static const члены которые инициализированы при объявлении, инициализаторы в enum.
По этому достаточно использовать constexpr переменные, тогда они будут вычислены на этапе компиляции:
constexpr int f() { return 42; }
int main() { constexpr int x = f(); return x; }

Комментариев нет:

Отправить комментарий