You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带explicit默认构造函数的C++代码在MSVC可运行但GCC/Clang报错,求标准判定

关于C++20中explicit默认构造函数与数组初始化的编译器行为问题

我在学习C++的explicit关键字及其用法后,编写了如下测试代码:

class Testing
{
public:
    explicit Testing() = default;
}; 
int main()
{
    Testing t[2] = {};  // 在MSVC中可运行,但GCC和Clang报错
}

该代码在MSVC中能正常编译运行,但在GCC和Clang下会报错。我使用的是C20标准,想明确这个示例中哪个编译器的行为符合C20标准。

GCC的报错信息如下:

<source>:8:21: error: converting to 'Testing' from initializer list would use explicit constructor 'constexpr Testing::Testing()'
    8 |     Testing t[2] = {};  //works with msvc but not with gcc and clang
      |                     ^

结论

GCC和Clang的行为符合C++20标准,MSVC的行为不符合。

原因说明

根据C++20标准,聚合初始化(比如数组的={}形式初始化)过程中,不允许使用被标记为explicit的构造函数来初始化元素。这里的数组Testing t[2] = {}属于聚合初始化场景,而Testing类的默认构造函数被声明为explicit,因此这种初始化方式是非法的,编译器应当报错。MSVC允许该写法属于非标准的扩展行为。

内容的提问来源于stack exchange,提问作者user19946454

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:01:04