In c++03
esso è abbastanza chiaro che l'eliminazione di un puntatore nullo non ha alcun effetto. Infatti, è esplicitamente affermato in §5.3.5/2
quanto:
In entrambe le alternative, se il valore dell'operando di cancellazione è il puntatore nullo, l'operazione non ha effetto.
Tuttavia, nell'attuale bozza di c++0x
questa frase sembra mancare. Nel resto della bozza ho potuto trovare solo frasi che affermano cosa succede se l'operando dell'espressione di cancellazione non è la costante del puntatore nullo. L'eliminazione del puntatore nullo è ancora definita in c++0x
e, in caso affermativo, dove?
Appunti:
Esistono prove circostanziali significative che suggeriscono che sia ancora ben definito.
Innanzitutto, ci sono le due frasi per §5.3.5/2
affermarlo
Nella prima alternativa (oggetto di cancellazione), il valore dell'operando di cancellazione può essere un valore di puntatore nullo, ...
e
Nella seconda alternativa (cancella array), il valore dell'operando di cancellazione può essere un valore di puntatore nullo o ...
Questi dicono che l'operando può essere nullo, ma da soli non definiscono effettivamente cosa succede se lo è.
In secondo luogo, cambiare il significato di delete 0
è un importante cambiamento radicale, e il comitato per gli standard sarebbe molto improbabile che effettui questo particolare cambiamento. Inoltre non si fa menzione che si tratti di una modifica sostanziale nell'Allegato sulla compatibilità (Allegato C) della c++0x
bozza. L'allegato C è tuttavia una sezione informativa, quindi questo non ha alcuna influenza sull'interpretazione della norma.
D'altra parte, il fatto che l'eliminazione del puntatore nullo non abbia alcun effetto implica un ulteriore controllo in fase di esecuzione. In molto codice l'operando non può mai essere nullo, quindi questo controllo di runtime è in conflitto con il principio di zero overhead. Forse il comitato ha appena deciso di modificare il comportamento per portare lo standard c ++ più in linea con gli obiettivi di progettazione dichiarati del linguaggio.