int main() {
const int x = 0;
int* y = x; // line 3
int* z = x+x; // line 4
}
Quoth standard (C++ 11 §4.10/1)Inizializzazione con costante puntatore nullo: quale comportamento è corretto?
Un puntatore nullo costante è un'espressione costante intera (5.19) prvalue di tipo intero che restituisce zero o un prvalue di tipo
std::nullptr_t
. Una costante puntatore nullo può essere convertita in un tipo di puntatore; ...
ci sono quattro possibilità:
Linea 4 è OK, ma la linea 3 non è. Questo perché
x
ex+x
sono entrambe espressioni costanti che valutano a 0, ma solox+x
è un valore di prvalue. Sembra che gcc prenda questa interpretazione (live demo)Le righe 3 e 4 sono entrambe OK. Sebbene
x
sia un lvalue, viene applicata la conversione lvalue-rvalue, dando un'espressione costante di prvalore uguale a 0. Il clang sul mio sistema (clang-3.0) accetta entrambe le righe 3 e 4.Linee 3 e 4 non sono entrambi OK. errori clang-3.4 su entrambe le linee (live demo).
La riga 3 è OK, ma la linea 4 non lo è. (Incluso per completezza anche se nessun compilatore che ho provato mostra questo comportamento.)
Chi ha ragione? Dipende dalla versione dello standard che stiamo considerando?
Al di fuori di "Chi ha ragione" per quanto riguarda (3) o (4), una domanda probabilmente altrettanto convincente è, chi farebbe effettivamente * * e * perché *? – WhozCraig