2014-06-14 15 views
6
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à:

  1. Linea 4 è OK, ma la linea 3 non è. Questo perché x e x+x sono entrambe espressioni costanti che valutano a 0, ma solo x+x è un valore di prvalue. Sembra che gcc prenda questa interpretazione (live demo)

  2. 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.

  3. Linee 3 e 4 non sono entrambi OK. errori clang-3.4 su entrambe le linee (live demo).

  4. 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?

+3

Al di fuori di "Chi ha ragione" per quanto riguarda (3) o (4), una domanda probabilmente altrettanto convincente è, chi farebbe effettivamente * * e * perché *? – WhozCraig

risposta

10

La dicitura nella norma è cambiata a causa di DR 903. La nuova formulazione è

Una costante puntatore nullo è un letterale intero (2.14.2) con valore zero o un prvalue di tipo std::nullptr_t.

emissione 903 riguarda un caso d'angolo curioso dove è impossibile produrre la risoluzione di sovraccarico "corretta" in alcuni casi in cui un parametro di modello è una (possibilmente 0) integer costante.

Apparentemente un certo numero di possibili soluzioni sono state considerate, ma

C'era un forte consenso tra gli CWG che solo il letterale 0 deve essere considerato un puntatore nullo costante, non ha alcun arbitrario zero valutati espressione costante è attualmente specificato.

Quindi, sì, dipende dal fatto che il compilatore abbia implementato la risoluzione su DR 903 o meno.

Problemi correlati