Ответ 1
Одна из причин могла бы сделать эти случаи более отчетливыми.
int ** p;
delete[] p
delete p[1];
Если бы это было delete p[]
, то ошибка одного символа имела бы довольно неприятные позывные.
В С++, если вы хотите динамически выделять массив, вы можете сделать что-то вроде этого:
int *p;
p = new int[i]; // i is some number
Однако, чтобы удалить массив, вы...
delete[] p;
Почему это не delete p[]
? Разве это не было бы более симметричным с тем, как оно было изначально создано? В чем причина (если есть), почему язык был разработан таким образом?
Одна из причин могла бы сделать эти случаи более отчетливыми.
int ** p;
delete[] p
delete p[1];
Если бы это было delete p[]
, то ошибка одного символа имела бы довольно неприятные позывные.
Поскольку массив переходит в указатель при передаче как параметра функции (или оператора). Таким образом, удаление p [] будет просто эквивалентно удалению p.
[править] Мы можем думать об удалении как о специальном операторе шаблона. Оператор должен иметь возможность разграничивать между p и p [], чтобы выбрать правильную "специализацию" (удаление без массива или массива). Однако правила вывода аргументов шаблона делают этот выбор невозможным (из-за разложения массива мы не можем дистанцироваться между p [] и p при выводе аргумента).
Таким образом, мы не можем использовать оператор с именем delete для обоих casees и необходимо ввести другой оператор delete [] с другим именем (суффикс [] можно рассматривать как часть имени оператора) для случая массива.
[edit 2] Примечание. delete p [] недействителен sintax вообще в соответствии с текущим стандартом. Приведенные выше рассуждения показывают только те проблемы, которые могут возникнуть, если мы попытаемся интерпретировать delete p [] с использованием существующих концепций С++.