die folgende Erklärung im globalen Namespace Gegeben:Selbstinitialisierung einer statischen constexpr-Variablen, ist sie wohlgeformt?
constexpr int x = x;
Ist das gut ausgebildet?
Der Entwurf der C++ 14 Standard-Teil 3.6.2
[basic.start.init] sagt:
Variables mit statischer Speicherdauer (3.7.1) oder Fadenspeicherdauer (3.7.2) erhält vor der Initialisierung initialisiert werden (8.5) . [...]
Was das Beispiel zu machen scheint gut definiert ist, dass x
mit seinem eigenen Wert bei konstanter Initialisierung initialisiert wird, die 0
aufgrund Null Initialisierung sein wird.
Ist das wirklich der Fall? Klirren accepts this code während gcc produces a diagnostic:
error: the value of 'x' is not usable in a constant expression
constexpr int x = x;
^
Es ist nie undefiniertes Verhalten. –
@ T.C. Als ich UB erwähnte, dachte ich an [diesen Fall] (http://stackoverflow.com/q/14935722/1708801) und die dazugehörige [C++ 14 Version hier] (http://stackoverflow.com/q/ 23415661/1708801). Ich hatte ursprünglich auf sie in der Frage verwiesen, fühlte mich aber, als würde es weniger deutlich machen. –
Sicher, aber in diesem Zusammenhang ist alles, was UB wäre, kein konstanter Ausdruck, wodurch die Initialisierung schlecht gebildet wird. –