2015-05-31 25 views
6

Conosco la differenza tra const e constexpr. Uno è una costante di tempo di compilazione e l'altro è o tempo di compilazione o costante di runtime.const constexpr char * vs. constexpr char *

Tuttavia, per la matrice di caratteri/stringhe, sono confuso perché il compilatore si lamenta del fatto che uno sia utilizzato rispetto all'altro.

Per esempio io ho:

constexpr char* A[2] = {"....", "....."}; 

const constexpr char* B[2] = {"....", "....."}; 

Con dichiarazione "A" ottengo:

ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 

ma con dichiarazione di "B" ottengo nessun avviso.

Perché il qualificatore di cost extra elimina l'avviso? Non sono entrambi "const char *" comunque? Chiedo perché entrambi sono dichiarati con constexpr che dovrebbe renderlo un const char* per impostazione predefinita?

mi aspetto un andare bene: S

+3

'constexpr' si applica al puntatore, rendendolo' const', ma non l'oggetto a cui punta. Quindi questo è uno dei pochi casi in cui potrebbe essere necessario combinare 'const' e' constexpr'. – 0x499602D2

+3

'constexpr char *' è un 'char * const'. L'identificatore 'constexpr' si applica all'intero tipo dell'oggetto - cioè, si applica alla dichiarazione-,' const' è un qualificatore (di un tipo). – dyp

risposta

8

const dice al compilatore che i caratteri si punta a non devono essere scritti.

constexpr indica al compilatore che i puntatori che si stanno memorizzando in questi array possono essere valutati totalmente al momento della compilazione. Tuttavia, non dice se i caratteri a cui puntano i puntatori potrebbero cambiare.

A proposito, un altro modo si potrebbe scrivere questo codice sarebbe:

const char * const B[2]; 

Il primo const vale per i caratteri, e il secondo const applicata alla matrice stessa ed i puntatori in esso contenuti.