Подтвердить что ты не робот

Является ли распределение динамического массива без указания размера хорошо сформированного кода?

Следующий простой фрагмент программы дает ошибки компиляции с 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.
Я ожидаю ответа на наблюдаемое поведение, независимо от того, полезен он или нет, я полностью осознаю, что это не полезно и не рекомендуется.

4b9b3361

Ответ 1

Это не является синтаксически правильным.

Посмотрите на синтаксис для нового выражения.

Объявление noptr-new-declarator должно содержать выражение между квадратными скобками, а выражение должно содержать в себе токен.

Ответ 2

Это не законный С++.

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 сообщает:

Этот тип должен быть полным типом объекта, но не абстрактным типом класса или его массивом.

Поскольку вы опустили размер массива, тип не завершен, а ваша программа недействительна С++.