Le espressioni non sono espressioni costanti se contengono uno qualsiasi di un numero di sottoespressioni non consentite. Una tale classe di consentiti sottoespressioni è:
- un Ivalue-to-rvalue conversione (4.1) a meno che non sia applicata a
- un glvalue di tipo intero o di enumerazione che si riferisce ad un non -volatile oggetto const con un precedente inizializzazione, inizializzato con un'espressione costante, o
- un glvalue di tipo letterale che si riferisce ad un oggetto non volatile definita con
constexpr
, o che si riferisce ad un sotto-oggetto di un tale oggetto oppure
- un valore glaciale di tipo letterale che fa riferimento a un oggetto temporaneo non volatile la cui durata non ha terminato , inizializzata con un'espressione costante;
In particolare, mentre il nome di un oggetto const di enum o tipo integrante inizializzato con un inizializzatore costante forma un costante espressione (leggendo il suo valore è ciò che provoca il lvalue-to-rvalue conversione), gli oggetti secondari di un oggetto aggregazione const (ad esempio list
nell'esempio, un array) non lo fanno, ma lo farebbero se dichiarato constexpr
.
const int list[3] = { 2, 5, 7 };
const int a = list[2];
Questo è valido ma a
non costituisce una costante espressione perché non è inizializzato con una costante espressione.
Modificando la dichiarazione di list
(non è necessario modificare la dichiarazione di a
), è possibile rendere a
una espressione costante.
constexpr int list[3] = { 2, 5, 7 };
const int a = list[2];
Come list[2]
è ora una costante espressione, a
ora è un oggetto const
di tipo integrante inizializzato con una costante espressione così a
può ora essere usato come un'espressione costante.
fonte
2012-06-09 23:35:50
Avevo pensato che il consulente sarebbe stato utile, e ora che guardo vedo che ha un'adozione più ampia di quanto pensassi. Detto questo, un po 'più di una spiegazione sul perchè la dichiarazione di const int a works ma list [1] in particolare non sarebbe apprezzata. Grazie. –
OK, quindi lo studio visivo 2012 non prevede di supportare constexpr. Qualcuno ha altre soluzioni? Non DEVO usarlo per questo, ma sarebbe bello. –
@ std''OrgnlDave Ho aggiunto più diagnostica del compilatore che spiega esattamente perché lista [1] non è un'espressione costante. – bames53