这是允许的:
int a[]{1, 2, 3};
但不是这个:
auto a = new int[]{1, 2, 3};
您必须指定边界。为什么?
编辑:正确的语法(不编译)是:
auto a = new (int[]){1, 2, 3};
这给出了真正的错误信息,即:
error: invalid use of array with unspecified bounds
最佳答案
MSalters' answer解决了为什么在最新版本的标准中没有改变这一点。在这里,我将回答附带的问题,“C++11 标准中的什么地方禁止这样做?”
关于 new (int[]){1, 2, 3}
首先,我们需要注意int[]
是一个不完全类型。
... an array of unknown size ... is an incompletely-defined object type. -[basic.types] §3.9 ¶5
最后,我们注意到 new
运算符不允许指定的类型不完整:
This type shall be a complete object type ... -[expr.new] §5.3.4 ¶1
当使用 braced-init-list 语法时,标准中没有任何异常(exception)情况。
关于new int[]{1, 2, 3}
int[]
在这种情况下使用 new-type-id 产生式进行解析,该产生式使用 noptr-new-declarator 产生式解析方括号:
noptr-new-declarator:
[ expression ] attribute-specifier-seqopt
noptr-new-declarator [ constant-expression ] attribute-specifier-seqopt
请注意,表达式并未标记为可选,因此该语法根本无法解析。
关于c++ - 为什么不能在新的初始化程序中省略数组大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27556840/