new int[];
根据我的编译器反汇编结果(VC++ 2012),它所做的与以下代码相同:
new int[0];
但这是否被C++标准规定?这是一条合法的指令吗?
new int[];
new int[0];
但这是否被C++标准规定?这是一条合法的指令吗?
new int[]
表达式在C++11中无效(我没有检查过C++14)。
使用单个[]
语法需要在方括号之间放置一个(隐式转换为)整数类型的表达式,表示所需的数组大小。
请注意,这个大小不一定是常数:在抽象层次的底层,这是你在C++中分配动态数组的方法。
C++11(通过N3290 final draft)§5.3.4/6:
“在noptr-new-declarator中的每个constant-expression都必须是整数常量表达式(5.19),并且求值为严格正值。noptr-new-declarator中的表达式应为整数类型,未作用域枚举类型或仅存在单个非显式转换函数以将其转换为整数或未作用域枚举类型的类类型(12.3)
第一个[]
方括号中使用expression。在随后的[]
方括号中,必须使用constant-expression(在编译时已知的值),因为外部数组维度的寻址需要已知大小的数组项。
当然,与其直接使用new
,你通常最好使用std::vector
(或者也许是std::string
)。
std::dynarray
或 std::valarray
,它们都是非常棒的连续容器。 - Yakk - Adam Nevraumontstd::dynarray
。有std::valarray
,但它很少被使用。据报道,这个设计是不完整的,但它还是以某种方式出现在C++98中。 - Cheers and hth. - Alfnew int[];
不合法。
根据草案标准n3337 § 5.3.4,[]
的第一个维度应该是一个表达式,每个后续维度(如果有)应该是一个常量表达式,遵循下面的语法规定:
noptr-new-declarator: [ expression ] attribute-specifier-seqopt noptr-new-declarator [ constant-expression ] attribute-specifier-seqopt
在此,每个constant-expression都应该是一个转换为std::size_t类型的转换常量表达式,如第6条所述:
noptr-new-declarator中的每个constant-expression都应该是一个转换为std::size_t类型的转换常量表达式(5.19),并且其值应该严格为正。在一个noptr-new-declarator中的expression会被隐式转换为std::size_t。
new int[i][5];
这意味着你不能在 5
的位置上使用非常量表达式。 - jrok
new int[0]
语句是否会分配内存。 - Yannnew int[]
的问题怎么可能成为一个关于new int[0]
的重复问题,毕竟前者在后者中从未提及? - Angew is no longer proud of SO