Ответ 1
Это не является синтаксически правильным.
Посмотрите на синтаксис для нового выражения.
Объявление noptr-new-declarator должно содержать выражение между квадратными скобками, а выражение должно содержать в себе токен.
Следующий простой фрагмент программы дает ошибки компиляции с gcc-4.3.4
.
Программа:
int main()
{
char *ptr = new char[10];
char *ptr1 = new char[];
return 0;
}
Ошибки компиляции:
prog.cpp: В функции 'int main():
prog.cpp: 4: ошибка: ожидаемое первичное выражение перед '] токеном
prog.cpp: 3: предупреждение: неиспользуемая переменная 'ptr
prog.cpp: 4: предупреждение: неиспользуемая переменная 'ptr1
Но то же самое компилируется с помощью MSVC без диагностического сообщения.
Итак, мой вопрос:
Позволяет ли Стандарт вызывать new []
без указания size
? Или это ошибка в MSVC?
Может ли кто-нибудь дать ссылку со стандарта, который окончательно скажет, что приведенный выше пример кода плохо сформирован или хорошо сформирован?
Я посмотрел:
5.3.4 Новый [expr.new] &
18.4.1.2 Формы массива [lib.new.delete.array]
но не смог найти никаких убедительных доказательств в отношении поведения.
EDIT:
Добавление тега Language Lawyer
.
Я ожидаю ответа на наблюдаемое поведение, независимо от того, полезен он или нет, я полностью осознаю, что это не полезно и не рекомендуется.
Это не является синтаксически правильным.
Посмотрите на синтаксис для нового выражения.
Объявление noptr-new-declarator должно содержать выражение между квадратными скобками, а выражение должно содержать в себе токен.
Это не законный С++.
5.3.4 Новый [expr.new] показывает, что является законным способом вызова new в большом списке, который содержит эту строку:
noptr-new-declarator:
[ expression ] attribute-specifier-seqopt
noptr-new-declarator [ constant-expression ] attribute-specifier-seqopt
а затем объясняет, что может быть константным выражением (в 5.4.3/6 и 5.4.3/7):
Каждое константное выражение в noptr-new-declarator должно быть интегральным постоянным выражением (5.19) и оцениваться строго положительным значением.
После некоторых мыслей, следующие пункты должны быть relavant:
8.3.4/1 [dcl.array], эти части:
В объявлении T D, где D имеет вид
D1 [ constant-expressionopt ] attribute-specifier-seqopt
а тип идентификатора в объявлении T D1 - "тип-тип-тип-декларатор T", тогда тип идентификатора D является типом массива;
и
если константное выражение опущено, тип идентификатора D является "массивом из производного-декларатора-типа-списка неизвестной границы T", неполным типом объекта.
5.3.4/1 сообщает:
Этот тип должен быть полным типом объекта, но не абстрактным типом класса или его массивом.
Поскольку вы опустили размер массива, тип не завершен, а ваша программа недействительна С++.