Являются ли неопределяемые функции constexpr корректными?
Рассмотрим следующий код:
constexpr unsigned f(unsigned x)
{
while (x & 1) x *= 3;
return x;
}
int main()
{
char a[f(2)];
char b[f(1)];
}
В случае, если это не очевидно: для нечетных целых чисел x
функция f
никогда не заканчивается.
Когда я компилирую вышеуказанную программу с clang on coliru, b
представляется VLA, но не a
:
warning: variable length arrays are a C99 feature [-Wvla-extension]
char b[f(1)];
Существует ли определенный предел, по которому компилятор решает прекратить оценку постоянного выражения? Или было бы прекрасно, если бы соответствующий компилятор перешел в бесконечный цикл? Получает ли f(1)
UB?
Ответы
Ответ 1
Существует ряд вещей, которые означают, что выражение
не основное постоянное выражение
- вызов функции constexpr
или конструктора constexpr
, который превысит пределы рекурсии, определенные реализацией;
(пятая точка в п. 5.19/2). Таким образом, предел - это реализация
определены.