Supponendo che N2116 sia la dicitura che viene incorporata, il tuo esempio è mal formato (notare che il non c'è alcun concetto di "legale/illegale" in C++). Il testo proposto per [decl.constexpr]/3 dice
- sua funzione-organismo è un composto-enunciato della forma
{ return expression; }
cui espressione è un'espressione potenziale costante (5,19);
La funzione viola il requisito in quanto dichiara inoltre una variabile locale.
Modifica: questa limitazione può essere superata spostando num all'esterno della funzione. La funzione non sarebbe ancora ben formato, quindi, perché espressione deve essere un'espressione potenziale costante, che è definito come
Un'espressione è un'espressione potenziale costante se è una costante espressione quando tutte le occorrenze dei parametri di funzione sono sostituiti da espressioni costanti arbitrarie del tipo appropriato.
IOW, reinterpret_cast<const unsigned char*> (&num)[0] == 0xDD
dovrebbe essere un'espressione costante. Tuttavia, non lo è: &num
sarebbe una costante-espressione di indirizzo (5.19/4). L'accesso al valore di tale puntatore non è tuttavia consentito per un'espressione costante:
L'operatore di sottoscrizione [] e l'accesso di membro della classe. e gli operatori , gli operatori unari &
e *
e i valori di puntatore (eccetto dynamic_casts, 5.2.7) possono essere utilizzati nella creazione di un'espressione costante di indirizzo , ma il valore di un oggetto non deve essere raggiunto dall'uso di questi operatori.
Modifica: il testo precedente è di C++ 98. Apparentemente, C++ 0x è più permissivo su ciò che consente espressioni costanti.L'espressione implica una conversione lvalue a rvalue del riferimento matrice, che è vietata dalle espressioni costanti salvo
viene applicato ad un lvalue di tipo integrale efficace che si riferisce a una variabile const non volatile o statico membro dati inizializzato con espressioni costanti
non è chiaro se (&num)[0]
"si riferisce a" una variabile const, o se solo un letterale num
"si riferisce a" una tale variabile. Se (&num)[0]
fa riferimento a tale variabile, non è chiaro se reinterpret_cast<const unsigned char*> (&num)[0]
si riferisca ancora a "num
".
Non credo si applichi, qui. La variabile statica è costante stessa. – GManNickG
La formulazione in 4.1 di N2116 afferma che il corpo della funzione deve avere solo un'istruzione (che è l'istruzione return). Intendiamoci, dal mio sguardo veloce sul testo, non vedo nulla che vieta il codice precedente se num è definito globalmente. – GRB
@GMan: come dice GRB, la bozza è abbastanza chiara che deve avere solo una dichiarazione e una dichiarazione * è * una dichiarazione (C++ 98, 6.7, dichiarazione Dichiarazione). @GRB: modificherò la mia risposta per discutere di spostare la costante al di fuori della funzione. –