2014-04-13 8 views
8

Un tentativo di creare un membro di una struttura con attributo constexpr senza essere statico ha come risultato un errore del compilatore (vedere di seguito). Perché? per un singolo valore costante avrò questo valore in memoria fino a quando il programma non viene terminato al posto del solo scope di struct? dovrei tornare a usare una macro?Perché constexpr deve essere statico?

struct foo 
{ 
    constexpr int n = 10; 
    // ... 
}; 

error: non-static data member cannot be constexpr; did you intend to make it static? 
+0

Beh, copiare non avrebbe molto senso. – Ben

+1

Molto meglio una volta nella memoria statica che molte volte, una in ogni istanza della struttura. – chris

+2

Perché dovresti avere una copia di 'constexpr' per ogni oggetto? –

risposta

12

Non conosco il razionale ufficiale. Ma sicuramente potrebbe portare a confusione. Io, per esempio, non riesco a vedere cosa significhi che un membro di dati non statici sia constexpr. Sei in grado di fare quanto segue?

struct foo { 
    constexpr int n = 10; 
    constexpr foo() { } 
    constexpr foo(int n):n(n) { } // overwrite value of n 
}; 

Oppure significa che l'inizializzazione deve essere costante sempre, cioè non ti è permesso di scrivere quanto sopra (perché n non è costante/potrebbero non costante), ma ha permesso di dire

foo f = { 10 }; 

La regola che constexpr int n è semplicemente mal formata piuttosto che essere implicitamente static mi sembra buona, poiché la sua semantica non sarebbe chiara IMO.

+0

Non vedo nulla di sbagliato con 'constexpr int n = 10' dato che è un tipo integrale ogni uso di' n' durante la compilazione dovrebbe essere sostituito con il suo valore proprio come nel caso di 'define'. La sintassi è abbastanza chiara, non capisco perché lo standard non lo consenta. –