使用初始化列表声明动态分配数组的数组大小

Moh*_*Ali 6 c++ gcc dynamic-arrays visual-c++ language-lawyer

我正在尝试使用初始化程序列表初始化动态声明的数组,但我注意到我必须使用 GCC 提供数组大小,否则会出现错误。如果忽略数组大小,使用 MSVC 尝试相同的操作不会导致任何错误。使用带有动态数组的初始值设定项列表时是否必须提供数组大小?这是实现定义的,这就是为什么两个编译器都不同的原因?

int *array { new int [3] {0, 1, 2} }; // Works with both MSVC and GCC.
int *array { new int [] {0, 1, 2} }; // Works only with MSVC, not GCC.
Run Code Online (Sandbox Code Playgroud)

dfr*_*fri 3

这是P1009R2:new-expressions 中的数组大小推导,它是为 C++20 实现的。

\n
\n

Bjarne Stroustrup 指出了 C++ 语言中的以下不一致之处:

\n
double a[]{1,2,3}; // this declaration is OK, ...\ndouble* p = new double[]{1,2,3}; // ...but this one is ill-formed!\n
Run Code Online (Sandbox Code Playgroud)\n

Jens Maurer 解释了为什么它不起作用:对于 new 表达式,根据 C++ 语法,方括号内的表达式目前是强制的。当为 C++11 引入统一初始化时,从初始化器的数量推断数组大小的规则从未扩展到 new 表达式情况。想必这只是被忽视了。我们没有任何根本原因无法使这项工作 [...]

\n

拟议措辞

\n

报告的问题旨在作为缺陷报告,并提出如下解决方案。措辞更改的效果应应用于其适用的所有先前版本的 C++ 的实现中。[...]

\n
\n

从GCC 的 C++ 标准支持页面中,我们可能会注意到 GCC 列出了 GCC 11 中实现的 P1009R2,并且我们可以验证 GCC 11 已向后移植该实现以接受 OP 的示例(到目前为止)格式良好返回 C++11。

\n

演示(GCC 11 / -std=c++11)。

\n