В C++23 появилась новая форма if предложения. Она позволяет разделять выполнение кода на этапе компиляции или на этапе выполнения программы.
Новое if предложение выглядет следующим образом:
if !opt consteval compound-statement
if !opt consteval compound-statement else statement
Если данное if предложение выполняется в контексте вычисления константного выражения, то управление получает первое составное предложение. В противном случае выполняется второе составное предложение, если оно присутствует, или следующее за if предложением предложение.
Ниже приведена простая демонстрационная программа.
#include <iostream>
constexpr bool test_consteval()
{
if consteval { return true; }
else { return false; }
}
int main()
{
const bool b1 = test_consteval();
bool b2 = test_consteval();
std::cout << std::boolalpha;
std::cout << "b1 is " << b1 << '\n';
std::cout << "b2 is " << b2 << '\n';
}
Вывод программы на консоль:
b1 is true
b2 is false
В заговочном файле <type_traits> имеетя функция
std::is_constant_evaluated, которая идентична вышепоказанной самописной функции. Таким образом вышеприведенная программа может быть переписана следующим образом:
#include <iostream>
#include <type_traits>
int main()
{
const bool b1 = std::is_constant_evaluated();
bool b2 = std::is_constant_evaluated();
std::cout << std::boolalpha;
std::cout << "b1 is " << b1 << '\n';
std::cout << "b2 is " << b2 << '\n';
}
Вывод программы на консоль будет полностью идентичен выводу предыдущей программы.
К сожалению,
MS VS19 C++ компилятор еще не поддерживает данную форму if предложения даже, если в свойствах проекта выбрать пункт для C++ компилятора
цитата: |
Предварительная версия — функции из последнего рабочего черновика C++ (/std:c++latest) |
|
С другой стороны, на
www.godbolt.org можно, например, выбрать одну из последних версий компилятора
clang, установив опцию
-std=c++23, и программы будут компилироваться.