Cppreference聚合初始化示例编译报错问题咨询(GCC 11.3.1)
问题原因分析
首先明确几个关键背景:
A a[2](A(1))是C++20新增的数组直接初始化语法,规则是用单个表达式初始化数组的所有元素,每个元素通过直接初始化方式从该表达式构造。- 你的代码中
A的构造函数被声明为explicit,但直接初始化场景本身允许调用explicit构造函数,因此语法上应该合法。
你遇到的编译错误,本质是GCC 11.3.1版本对该C++20特性的实现存在缺陷:编译器错误地将A a[2](A(1))的初始化逻辑解析为依赖隐式转换的场景,误以为需要通过初始化列表隐式调用explicit构造函数,从而触发了错误提示。
验证与解决方案
- 版本升级:将GCC升级到12及以上版本,后续版本修复了这个C++20特性的实现问题,
A a[2](A(1))可以正常编译。 - 替代写法:如果暂时无法升级编译器,使用列表初始化
A b[2]{A(1), A(1)}(显式初始化所有元素)或A b[2]{A(1)}(第二个元素值初始化)来达到类似效果,这两种写法在C++11及以后的标准中都能被编译器正确处理。
内容的提问来源于stack exchange,提问作者Vinod
相关产品推荐
相关产品推荐

