这行代码有什么作用?
new int[];
根据我编译器的反汇编(VC ++ 2012),它的作用与:
相同new int[0];
但它是否由C ++标准指定?这是一份法律指示吗?
答案 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。