c++ - 为什么不能在新的初始化程序中省略数组大小?

标签 c++ c++11 language-lawyer

这是允许的:

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/

相关文章:

c++ - 我可以禁用 std::vector 的复制构造函数吗?

inheritance - 派生类的大括号(无构造函数)初始化

c - MISRA C 2012 是否表示不使用 bool

c++ - 未指定时,C++ 运算符的操作数的值类别是什么?

c++ - apache 的 c/c++ 模块

c++:程序设置 - boost.PropertyTree 或 boost.program_options?

c++ - g++ 认为我的类声明是 "forward declaration"

c++ - 避免 RAII 计时器对象中的虚假构造和破坏

c++ - 如何在另一个类模板中定义完全专用类的构造函数

c++ - 查询相似句子的有效方法