W c++03
nim jest całkiem jasne, że usuwając wskaźnik NULL nie ma żadnego wpływu. Rzeczywiście, jest wyraźnie stwierdzone, §5.3.5/2
że:
W obu przypadkach, jeśli wartość operandu delete jest pustym wskaźnikiem, operacja nie ma żadnego efektu.
Jednak w obecnym projekcie dla c++0x
tego zdania wydaje się być brakuje. W pozostałej części szkicu mogłem znaleźć tylko zdania stwierdzające, co się stanie, jeśli operand wyrażenia delete nie jest stałą zerowego wskaźnika. Czy usuwanie pustego wskaźnika jest nadal zdefiniowane w programie c++0x
, a jeśli tak, to gdzie?
Uwagi:
Istnieją istotne poszlaki sugerujące, że jest on nadal dobrze zdefiniowany.
Po pierwsze, istnieją dwa zdania w §5.3.5/2
stwierdzające, że
W pierwszej alternatywie (obiekt usuń) wartość argumentu usuwania może być wartością wskaźnika zerowego, ...
i
W drugiej alternatywie (tablica usuwania) wartość argumentu usuwania może być wartością wskaźnika zerowego lub ...
Mówi się, że operand może być zerowy, ale sam w sobie nie definiuje, co się stanie, jeśli tak jest.
Po drugie, zmiana znaczenia delete 0
jest poważną i przełomową zmianą, a komitet normalizacyjny raczej nie wprowadziłby tej konkretnej zmiany. Ponadto nie ma wzmianki o tym, że jest to przełomowa zmiana w załączniku dotyczącym zgodności (załącznik C) do c++0x
projektu. Załącznik C jest jednak częścią informacyjną, więc nie ma to wpływu na interpretację normy.
Z drugiej strony fakt, że usunięcie wskaźnika zerowego jest wymagane, aby nie przyniosło żadnego efektu, oznacza dodatkowe sprawdzenie w czasie wykonywania. W wielu kodach operand nigdy nie może być zerowy, więc to sprawdzenie w czasie wykonywania jest sprzeczne z zasadą zerowego narzutu. Być może komisja po prostu zdecydowała się zmienić zachowanie, aby dostosować standard C ++ bardziej do założonych celów projektowych języka.