为什么不能在新的初始值设定项中省略数组大小?

use*_*981 18 c++ language-lawyer c++11

这是允许的:

int a[]{1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

但不是这个:

auto a = new int[]{1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

您必须指定边界.为什么?

编辑:正确的语法(不编译)是:

auto a = new (int[]){1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

这给出了真正的错误消息,即:

error: invalid use of array with unspecified bounds
Run Code Online (Sandbox Code Playgroud)

cdh*_*wie 9

MSalters的回答解决了为什么在最新版本的标准中没有改变的原因.在这里,我将回答同伴问题,"C++ 11标准在哪里被禁止?"

关于 new (int[]){1, 2, 3}

首先,我们需要注意这int[]是一种不完整的类型.

...一个未知大小的数组......是一个未完全定义的对象类型. - [basic.types]§3.95

最后,我们注意到new运算符不允许指定的类型不完整:

此类型应为完整的对象类型... - [expr.new]§5.3.41

当使用braced-init-list语法时,标准中没有任何内容可以例外.

关于 new int[]{1, 2, 3}

int[]在这种情况下,使用new-type-id生成解析,该生成使用noptr-new-declarator生成来解析方括号:

noptr-new-declarator:
    [ expression ] attribute-specifier-seq opt
     noptr-new-declarator [ constant-expression ] attribute-specifier-seq opt

请注意,表达式未标记为可选,因此此语法无法解析.


MSa*_*ers 5

正如Jonathan Wakely在评论中已经指出的那样,这实际上是一个封闭的问题.决议"应该在Evolution工作组中处理"实质上意味着WG21认为这本身并不是一个坏主意,但与此同时他们并不认为它是当前标准中的缺陷.这是有道理的 - 没有任何提示应该起作用的暗示,这只是类比.