c++ - 使用初始化列表声明动态分配数组的数组大小
问题描述
我正在尝试使用初始化列表初始化动态声明的数组,但我注意到我必须使用 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.
解决方案
这是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
)。
推荐阅读
- kubernetes - 如何在部署前将环境变量注入 Kubernetes Pod
- docker - Jenkins Pipeline 构建 Dockerfile 但无法在容器内运行步骤
- azure-devops - 如何通过 CI/CD 管道创建 Azure 函数应用消息队列?
- excel - 具有多个条件的复杂公式
- kotlin - Kotlin 箭头组合已验证列表
- java - 执行带有多个参数的存储过程,并使用spring data jpa将ResultSet映射到非实体类
- google-cloud-firestore - FireStore 侦听在 APIS Explorer 中不起作用
- javascript - 如何从 li 值中获取元素并操作其值?
- c# - 如何重置绑定到 textBlock 的总和值?
- node.js - Typeorm 失败时重试连接