什么是"new int [];" 做?

NPS*_*NPS 4 c++ arrays new-operator c++11

这行代码有什么作用?

new int[];
Run Code Online (Sandbox Code Playgroud)

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

new int[0];
Run Code Online (Sandbox Code Playgroud)

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

Che*_*Alf 8

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

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

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


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

" noptr-new-declarator中的每个常量表达式都应是一个整数常量表达式(5.19),并评估为严格正值.的表达在一个noptr新声明符应整数类型,无作用域枚举类型,或者用于其中单个非显式转换功能积分或无作用域枚举类型存在的类类型的(12.3)

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


当然,不是new直接使用你通常会更好地使用std::vector(或可能std::string).


P0W*_*P0W 7

new int[]; 
Run Code Online (Sandbox Code Playgroud)

不合法.

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

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

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

noptr-new-declarator中的每个常量表达式都应该是std :: size_t类型的转换常量表达式(5.19),并且应该计算为严格正值.的表达在一个 noptr新声明符被隐式转换到std ::为size_t.

  • @remyabel*const-expression*表示它意味着什么.但是只有当你动态分配数组时才需要它,例如`new int [i] [5];`意味着你不能用非常量表达式代替`5`. (2认同)