什么是“new int [];”做?

时间:2014-10-16 12:25:20

标签: c++ arrays c++11 new-operator

这行代码有什么作用?

new int[];

根据我编译器的反汇编(VC ++ 2012),它的作用与:

相同
new int[0];

但它是否由C ++标准指定?这是一份法律指示吗?

2 个答案:

答案 0 :(得分:8)

表达式new int[]对C ++ 11无效(我没有检查过C ++ 14)。

使用单个[]语法需要括号之间的(隐式可转换为)整数类型表达式,表示所需的数组大小。

请注意,此大小不需要是常量:在底层抽象级别,这是您在C ++中分配动态数组的方式。


C ++ 11(通过N3290最终草案)§5.3.4/ 6:

  

noptr-new-declarator 中的每个常量表达式应为整数常量表达式(5.19)并且   评估为严格正值。 noptr-new-declarator 中的表达式应为整数类型,   unscoped枚举类型,或单个非显式转换函数为整数或类的类类型   unscoped枚举类型存在(12.3)

表达式用于第一个[]括号。在随后的[]括号中,必须使用常量表达式(编译时已知的值),因为最外层数组维度的寻址需要已知大小的数组项。


当然,不是直接使用new,而是使用std::vector(或者std::string)通常会更好。

答案 1 :(得分:7)

new int[]; 

不合法。

根据标准草案n3337§5.3.4,[]应该有第一个维度的表达式常量表达式对于每个后续维度(如果有的话),由语法指示:

noptr-new-declarator:
     [ expression ] attribute-specifier-seqopt
     noptr-new-declarator [ constant-expression ] attribute-specifier-seqopt

这里,每个常量表达式应该是转换的常量表达式,如第6节所述:

  

noptr-new-declarator 中的每个常量表达式应为   转换为std :: size_t类型的常量表达式(5.19)并且应该   评估为严格正值。 a中的表达式    noptr-new-declarator 被隐式转换为std :: size_t。