带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
相关产品推荐
相关产品推荐

