Безопасно ли удалять nullptr в c ++ 0x?

В c ++ 03 это довольно ясно, что удаление нулевого указателя не имеет никакого эффекта. Действительно, в §5.3.5 / 2 явно указано, что:

В любом случае, если значением операнда удаления является нулевой указатель, операция не имеет никакого эффекта.

Однако , в текущем проекте для c ++ 0x это предложение, похоже, отсутствует. В остальной части черновика я смог найти только предложения, в которых говорится, что произойдет, если операнд выражения удаления не является константой нулевого указателя. Удаление нулевого указателя все еще определено в c ++ 0x , и если да, то где?

Примечания:

Существуют важные косвенные доказательства того, что он все еще хорошо определен.

Во-первых, в §5.3.5 / 2 есть два предложения, в которых говорится, что

В первой альтернативе (объект удаления) значение операнда удаления может быть значением нулевого указателя. , ...

и

Во втором варианте (массив удаления) значение операнда удаления может быть значением нулевого указателя или ...

Они говорят, что операнду разрешено быть нулевым , но сами по себе не определяют, что произойдет, если это произойдет.

Во-вторых, изменение значения delete 0 является серьезным критическим изменением, и комитет по стандартам вряд ли внесет это конкретное изменение . Кроме того, нет упоминания о том, что это критическое изменение в Приложении совместимости (Приложение C) к проекту c ++ 0x . Приложение C, однако, является информативным разделом, поэтому оно не имеет никакого отношения к интерпретации стандарта.

С другой стороны, тот факт, что удаление нулевого указателя требуется, чтобы не иметь эффекта, подразумевает дополнительную проверку во время выполнения. Во многих кодах операнд никогда не может быть нулевым,поэтому эта проверка во время выполнения противоречит принципу нулевых накладных расходов. Возможно, комитет просто решил изменить поведение, чтобы привести стандартный C ++ в большее соответствие с заявленными целями проектирования языка.

73
задан Scooter 30 November 2014 в 02:58
поделиться