首页 > 解决方案 > 使用初始化列表声明动态分配数组的数组大小

问题描述

我正在尝试使用初始化列表初始化动态声明的数组,但我注意到我必须使用 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.

标签: c++gccvisual-c++language-lawyerdynamic-arrays

解决方案


这是P1009R2 : Array size deduction in new-expressions,它是为 C++20 实现的。

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

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

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

提议的措辞

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

GCC 的 C++ 标准支持页面中,我们可能会注意到 GCC 将 P1009R2 列为从 GCC 11 开始实现的,我们可以验证 GCC 11 已经向后移植了实现以接受 OP 的示例,并且早在 C++11 .

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


推荐阅读