以下简单程序代码段提供了gcc-4.3.4
的编译错误。
程序:
int main()
{
char *ptr = new char[10];
char *ptr1 = new char[];
return 0;
}
编译错误:
prog.cpp:在函数'int main()'中:
prog.cpp:4:错误:在']'标记之前预期的primary-expression
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]
但无法找到有关该行为的任何确凿证据。
修改
添加Language Lawyer
标记。
我期待观察到的行为的答案,无论它是否有用,我完全清楚它没有用处,也没有推荐。
答案 0 :(得分:4)
答案 1 :(得分:4)
这不是合法的c ++。
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)并且计算为严格正值。
经过一番思考后,下一个项目应该是相关的:
8.3.4 / 1 [dcl.array] ,这些部分:
在声明T D中,D的格式为
D1 [ constant-expressionopt ] attribute-specifier-seqopt
并且声明T D1中的标识符的类型是“derived-declarator-type-list T”,那么D的标识符的类型是数组类型;
和
如果省略常量表达式,则D的标识符的类型是“T的未知边界的derived-declarator-type-list数组”,这是一种不完整的对象类型。
5.3.4 / 1 告诉:
此类型应为完整的对象类型,但不是抽象类类型或其数组
由于您省略了数组大小,因此类型不完整,并且您的程序无效c ++。