Ключевое слово consteval
Ключевое слово consteval указывает компилятору,
что функция должна вычисляться во время компиляции.
Такие функции называются немедленными
(immediate functions). Если вызов consteval-функции
не может быть вычислен на этапе компиляции,
программа считается некорректной и компилятор
выдаст ошибку. Параметры функции при этом должны
быть константными выражениями, известными
на момент компиляции.
Ключевое слово consteval появилось в стандарте
C++20. В отличие от constexpr, которое лишь
разрешает вычисление на этапе компиляции,
consteval требует его.
Синтаксис
consteval return_type function_name(parameters)
{
// тело функции
}
Пример
Давайте объявим consteval-функцию,
которая возводит число в квадрат, и вызовем её
с константным аргументом:
#include <iostream>
using namespace std;
consteval int square(int n)
{
return n * n;
}
int main()
{
int res = square(5);
cout << res << endl;
return 0;
}
Результат выполнения кода:
25
Пример
Давайте попробуем вызвать consteval-функцию
с переменной, значение которой известно только
во время выполнения. Такой код не скомпилируется:
#include <iostream>
using namespace std;
consteval int square(int n)
{
return n * n;
}
int main()
{
int x = 5;
// ошибка компиляции: x не является
// константным выражением
int res = square(x);
cout << res << endl;
return 0;
}
Результат выполнения кода:
error: call to consteval function 'square' is not a constant expression
Пример
Давайте используем consteval-функцию
для вычисления размера массива на этапе компиляции:
#include <iostream>
using namespace std;
consteval int get_size()
{
return 5;
}
int main()
{
int arr[get_size()] = {1, 2, 3, 4, 5};
for (int i = 0; i < get_size(); i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
1 2 3 4 5