Autoinizializzazione di una variabile statica constexpr, è ben formata?

Data la seguente dichiarazione nello spazio dei nomi globale:

constexpr int x = x; 

È così ben formato?

La bozza di standard C ++ 14 sezione 3.6.2 [basic.start.init] dice:

Le variabili con durata di memorizzazione statica (3.7.1) o durata di memorizzazione del thread (3.7.2) devono essere inizializzate a zero (8.5) prima di ogni altra inizializzazione. […]

Ciò che sembra rendere ben definito l’esempio è che x viene inizializzato con il proprio valore durante l’inizializzazione costante che sarà 0 causa dell’inizializzazione zero.

È davvero così? clang accetta questo codice mentre gcc produce una diagnostica :

 error: the value of 'x' is not usable in a constant expression constexpr int x = x; ^ 

Questo è stato chiarito e reso mal formato dal rapporto sui difetti 2026: Zero-initialization e constexpr che chiede:

Secondo 3.6.2 [basic.start.init] paragrafo 2,

Le variabili con durata di memorizzazione statica (3.7.1 [basic.stc.static]) o durata di memorizzazione del thread (3.7.2 [basic.stc.thread]) devono essere inizializzate a zero (8.5 [dcl.init]) prima di qualsiasi altra inizializzazione ha luogo.

Questo vale anche per l’inizializzazione costante? Ad esempio, il seguente dovrebbe essere ben formato, basandosi sulla presunta inizializzazione dello zero precedente all’inizializzazione costante?

 constexpr int i = i; struct s { constexpr s() : v(v) { } int v; }; constexpr s s1; 

La nota prima della risoluzione proposta dice:

CWG ha convenuto che un’inizializzazione costante dovrebbe essere considerata come avvenente invece dell’inizializzazione zero in questi casi, rendendo le dichiarazioni mal formate.

e la proposta di risoluzione chiarisce e tra molte modifiche, rimuove la seguente formulazione:

Le variabili con durata di memorizzazione statica (3.7.1) o durata di memorizzazione del thread (3.7.2) devono essere inizializzate a zero (8.5) prima di ogni altra inizializzazione. […]

e aggiunge la seguente formulazione:

Se l’inizializzazione costante non viene eseguita, una variabile con durata di memorizzazione statica (3.7.1 [basic.stc.static]) o durata di memorizzazione del thread (3.7.2 [basic.stc.thread]) viene inizializzata a zero (8.5 [dcl. dentro]). […]

È un grande cambiamento, rinomina [basic.start.init] in [basic.start.static] e crea una nuova sezione [basic.start.dynamic] e modifica [stmt.dcl]