GCC 不支持新表达式中的大括号省略号
GCC does not support brace elision in a new-expression
考虑这个程序:
struct S {
int m;
};
int main() {
S s_arr[1]{0};
S *s_new = new S[1]{0};
int i_arr[1][1]{0};
int (*i_new)[1] = new int[1][1]{0};
return 0;
}
我认为 main 函数中的所有四个变量都应该使用聚合初始化进行初始化。
但是,GCC 只接受s_arr
和i_arr
,但拒绝s_new
和i_new
报告(Ubuntu 上的 g++ 8.3.0(:
test.cpp: In function ‘int main()’:
test.cpp:7:26: error: could not convert ‘0’ from ‘int’ to ‘S’
S *s_new = new S[1]{0};
^
test.cpp:9:38: error: array must be initialized with a brace-enclosed initializer
int (*i_new)[1] = new int[1][1]{0};
^
test.cpp:9:38: error: array must be initialized with a brace-enclosed initializer
(注意:最后一行重复由 G++ 生成(
我也在 godbolt 上测试过,从 6.1 到 9.2 的 gcc 版本都无法编译这个程序。6.x 和 7.x 版本还给出了消息:">抱歉,未实现:无法使用初始值设定项初始化多维数组"i_new
。
将{0}
更改为{{0}}
可以解决在 godbolt 上测试的所有 GCC 版本(6.1 到 9.2(的s_new
和inew
问题。我可以理解这一点,因为S[1]
和int[1][1]
都是聚合类型,其元素类型是子聚合(S
数组;数组数组(。但是,C++允许省略这些大括号,并且 GCC 接受s_arr
和i_arr
,其中省略了这些大括号。
另一方面,clang 6.0.0 到 clang 9.0.0 愉快地接受了原始程序。
在 C++14 的规范中(gnu++14 是 GCC 6.5/7.4/8.3/9.2 的默认值(,
5.3.4 新建/17
创建类型 T 的对象的新表达式按如下方式初始化该对象:
......
(17.2( — 否则,将根据 8.5 的初始化规则解释 new-initializer 以进行直接初始化。
新初始值设定项应解释为直接初始化。由于s_arr
和i_arr
也是直接初始化的,我认为它们应该以相同的方式解释,并且原始程序应该格式良好。
我在这里缺少什么,还是这是 GCC 中的错误?
我试图搜索GCC Bugzilla,但没有找到任何相关的内容。
是的,这绝对是一个错误。new
表达式被定义为使用直接初始化规则([expr.new]/18.2(,大括号省略适用于所有聚合初始化的情况([dcl.init.aggr]/12(。
如果在搜索 bugzilla 后找不到错误,请提交错误。
- 为什么istream不支持右值提取
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- Casablanca/cpprestsdk listener.support接受函数,但不支持方法
- 为什么C++不支持对未初始化变量进行智能分析?
- 在 c++ 中连接字符串和整数,以便在 C++ 11 不支持计算机的情况下读取多个文件
- 在 Ubuntu 18.04 上编译 GLSL 着色器时"不支持 GLSL 3.30"?
- 为什么联机C++ IDE 不支持"graphics.h"头文件?
- Clang编译器不支持aarch64-apple-darwin上的-fxray-instrument
- 为什么我的 clang 格式不支持 PPDirectiveIndentStyle 选项?
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 为什么不支持 Xcode 1.5?
- C++20 从括号中的值列表初始化聚合,不支持内部数组
- 为什么结构化绑定不支持可变数组?
- 您选择的 CPU 不支持 x86-64 指令集
- 将数据发送到多个客户端 UDP 时不支持地址族
- 缺少类型说明符 - 假定为 int.注意 c++ 不支持 default-int
- 瓦尔格林德"不支持arch_prctl选项"
- 错误:C4430:缺少类型说明符-假定为int.注意:C++不支持default-int
- GCC 不支持新表达式中的大括号省略号
- 为什么C++不支持强类型省略号?