【问题标题】:Declaring array size for dynamically allocated array with initializer list使用初始化列表声明动态分配数组的数组大小
【发布时间】:2021-06-21 03:21:27
【问题描述】:

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

【问题讨论】:

  • Clang 也支持两个版本Demo
  • initializer-list 标签指的是std::initializer_list
  • 不是 100%,我无法列出所有细节,但我认为 g++ 在这里是错误的,应该接受第二个版本。 This reference 还提供了 double* p = new double[]{1,2,3}; 作为工作示例。

标签: c++ gcc visual-c++ language-lawyer dynamic-arrays


【解决方案1】:

这是P1009R2new-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 引入了初始化,关于从 初始化器的数量从未扩展到新表达式的情况。大概这只是 被忽视了。我们无法完成这项工作没有根本原因 [...]

提议的措辞

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

GCC's C++ Standards Support pages,我们可能会注意到 GCC 将 P1009R2 列为从 GCC 11 开始实现的,我们可以验证 GCC 11 已经向后移植了实现以接受 OP 的示例,并且早在 C++ 11.

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

【讨论】:

  • 感谢您的回复。我想我的问题是,如果 GCC 已经实现了它,为什么它对我不起作用。 imgur.com/a/LtgDwTh
  • @MohammadAli 请参阅我回答的最后一部分:这已为 GCC 11 实现;在此之前的任何版本(例如 GCC 10)都不包含此功能。由于 GCC 11 是最先进的,您可能会在自己的工具链中使用旧版本。
  • 谢谢,我误以为我需要使用 C++11 标准或更高版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 2013-12-01
  • 1970-01-01
  • 2020-05-04
相关资源
最近更新 更多