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

问题描述

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

int *array { new int [3] {0,1,2} }; // Works with both MSVC and GCC.
int *array { new int [] {0,2} }; // Works only with MSVC,not GCC.

解决方法

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

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

double a[]{1,2,3}; // this declaration is OK,...
double* p = new double[]{1,3}; // ...but this one is ill-formed!

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

提议的措辞

报告的问题旨在作为缺陷报告,建议的解决方案如下。效果 的措辞变化 应该应用于所有以前版本的 C++ 的实现,其中 他们适用。 [...]

GCC's C++ Standards Support pages 我们可能会注意到 GCC 列出了从 GCC 11 开始实现的 P1009R2,并且我们可以验证 GCC 11 已经向后移植了实现以接受 OP 的示例,就像 C 一样格式良好++11。

DEMO (GCC 11 / -std=c++11)。