В c++03
довольно ясно, что удаление нулевого указателя не влияет. В самом деле, в §5.3.5/2
явно указано, что:
В любой альтернативе, если значение операнда удаления является нулевым указателем, операция не имеет эффекта.
Однако в текущем проекте для c++0x
это предложение кажется отсутствующим. В остальной части проекта я мог только найти предложения о том, что произойдет, если операнд выражения delete не является константой нулевого указателя. Удаляет нулевой указатель, все еще определенный в c++0x
, и если да, где?
Примечания:
Существуют значительные косвенные доказательства того, что они все еще четко определены.
Во-первых, в §5.3.5/2
есть два предложения, в которых указано, что
В первом альтернативе (удалить объект) значение операнда удаления может быть значением нулевого указателя,...
и
Во втором альтернативе (удалить массив) значение операнда удаления может быть значением нулевого указателя или...
Они говорят, что операнду разрешено быть нулевым, но сами по себе не определяют, что произойдет, если оно есть.
Во-вторых, изменение значения delete 0
является серьезным нарушением изменений, и комитет по стандартам вряд ли изменит это конкретное изменение. Более того, упоминание об этом не является изменением в приложении совместимости (Приложение C) проекта c++0x
. Однако приложение С является информационным разделом, поэтому это не имеет никакого отношения к толкованию стандарта.
С другой стороны, тот факт, что удаление нулевого указателя не требуется, подразумевает дополнительную проверку во время выполнения. Во множестве кода операнд никогда не может быть нулевым, поэтому эта проверка времени выполнения противоречит принципу нулевой надбавки. Возможно, комитет просто решил изменить поведение, чтобы привести стандартное С++ в соответствие с заявленными целями дизайна языка.