В С++ 17 этот код недопустим:
constexpr int foo(int i) {
return std::integral_constant<int, i>::value;
}
Это потому, что даже если foo
может быть вычислен во время компиляции, компилятору все равно нужно создавать инструкции для его выполнения во время выполнения, что делает невозможным создание экземпляра шаблона.
В С++ 20 у нас будут функции consteval
, которые необходимо оценивать во время компиляции, поэтому ограничение времени выполнения должно быть снято. Означает ли это, что этот код будет законным?
consteval int foo(int i) {
return std::integral_constant<int, i>::value;
}