Betrachten Sie den folgenden Code ein:Sind nicht-terminierende consExpr-Funktionen klar definiert?
constexpr unsigned f(unsigned x)
{
while (x & 1) x *= 3;
return x;
}
int main()
{
char a[f(2)];
char b[f(1)];
}
Falls es nicht auf der Hand: für ungerade Zahlen x
, die Funktion f
endet nie.
Wenn ich das obige Programm kompilieren with clang on coliru, scheint b
ein VLA zu sein, aber nicht a
:
warning: variable length arrays are a C99 feature [-Wvla-extension]
char b[f(1)];
Gibt es eine gut definierte Grenze, bei der der Compiler Auswertung eines konstanten Ausdruck zu stoppen entscheidet? Oder wäre es vollkommen in Ordnung, wenn ein kompilierender Compiler in eine Endlosschleife geht? Ergibt f(1)
UB?
Alternativtitel: "Löst constexpr das Anhalteproblem?" (Witze, natürlich) – stefan