In C++, l'errore non è la chiamata alla arraySize(y)
, ma la dichiarazione di y
stessa.
I limiti di una dichiarazione di matrice devono essere "espressione costante convertita".
Se il compilatore accetta la dichiarazione di y
e poi si dice che y
è un array di runtime legato, non è un compilatore C++. Non ci sono matrici di limiti di runtime in alcuna versione ratificata di C++, né la bozza corrente.
La differenza significativa tra arraySize(s.c)
e arraySize(ps->c)
è che ps->c
è la stessa (*ps).c
e l'operatore *
dereferenziazione richiede conversione Ivalue a rvalue su ps
, che non è un'espressione costante (né è &s
, vedi sotto). Il resto dell'espressione non coinvolge la conversione da lvalue a rvalue, l'array lvalue è direttamente vincolato dal riferimento.
Un'espressione costante è o un nucleo glvalue un'espressione costante il cui valore si riferisce a un'entità che è un risultato permesso di un'espressione costante (come sotto definito), o un prvalue nucleo un'espressione costante il cui valore è un oggetto in cui, per tale oggetto e gli oggetti secondari:
ciascun membro dati non-statico del tipo di riferimento si riferisce a un'entità che è il risultato di una costante consentita espressione e
i Se l'oggetto o subobject è di tipo puntatore, contiene l'indirizzo di un oggetto con durata di memorizzazione statica, l'indirizzo oltre la fine di tale oggetto (5.7), l'indirizzo di una funzione o un valore di puntatore nullo.
Un'entità è il risultato consentito di un'espressione costante se è un oggetto con durata di conservazione statica che è o non è un oggetto temporaneo o è un oggetto temporaneo cui valore soddisfa es limiti sopra descritti, o è un funzione.
Chiaramente ps
contiene l'indirizzo di un oggetto con durata di conservazione automatico, quindi non può essere dichiarato constexpr
. Ma tutto dovrebbe iniziare a lavorare se si cambia S s; S* ps = &s;
-static S s; constexpr S* ps = &s;
(D'altra parte, si potrebbe pensare che il parametro da arraySize(s.c)
non è un'espressione costante sia, dal momento che è un punto di riferimento e non un oggetto di archiviazione statica durata)
fonte
2015-01-22 04:27:48
Qual è l'errore? –
beh io sono stumped ... sia 'sc' che' ps-> c' hanno lo stesso tipo, come spited di 'typeid (sc) .name()' o 'typeid (ps-> c) .name() ', es'A10_c' per g ++ – vsoftco
Per scurirlo un po 'di più: se si imposta il parametro' arraySize() 'come riferimento a const, la seguente compilazione:' char y [arraySize (decltype (ps-> c) {})]; ' – Quentin