Data la seguente dichiarazione nel namespace globale:Autoinizializzazione di una variabile constexpr statica, è ben formata?
constexpr int x = x;
È questo il ben formato?
Il progetto C++ 14 sezione standard 3.6.2
[basic.start.init] detto:
variabili con durata statica stoccaggio (3.7.1) o durata di conservazione filo (3.7.2) deve essere inizializzato a zero (8.5) prima di qualsiasi altra inizializzazione. [...]
Cosa sembra rendere esempio ben definita è che x
viene inizializzato con il proprio valore durante l'inizializzazione costante che sarà 0
dovuta a zero inizializzazione.
È davvero così? clang accepts this code mentre gcc produces a diagnostic:
error: the value of 'x' is not usable in a constant expression
constexpr int x = x;
^
Non è mai un comportamento indefinito. –
@ T.C. quando ho menzionato UB, stavo pensando a [questo caso] (http://stackoverflow.com/q/14935722/1708801) e alla relativa [versione C++ 14 qui] (http://stackoverflow.com/q/ 23415661/1708801). All'inizio avevo fatto riferimento a loro nella domanda, ma mi sembrava che fosse meno chiaro. –
Certo, ma in questo contesto, tutto ciò che sarebbe UB non è un'espressione costante, rendendo invece l'inizializzazione mal formata. –