Подтвердить что ты не робот

Являются ли неопределяемые функции 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?

4b9b3361

Ответ 1

Существует ряд вещей, которые означают, что выражение не основное постоянное выражение

- вызов функции constexpr или конструктора constexpr, который превысит пределы рекурсии, определенные реализацией;

(пятая точка в п. 5.19/2). Таким образом, предел - это реализация определены.