分配动态数组而不指定格式良好的代码?

时间:2012-03-20 05:24:09

标签: c++ new-operator language-lawyer

以下简单程序代码段提供了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标记。
我期待观察到的行为的答案,无论它是否有用,我完全清楚它没有用处,也没有推荐。

2 个答案:

答案 0 :(得分:4)

这在语法上并不正确。

查看 new-expression syntax

noptr-new-declarator 必须在方括号之间包含表达式表达式必须包含一个标记。< / p>

答案 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 ++。