C++类模板构造函数Clang编译通过,GCC/MSVC报错,谁符合标准?
问题原因与标准合规性分析
核心问题:非法的拷贝构造函数声明
当模板A<T>实例化为A<bool>时,类中的构造函数声明A(A<bool>)会被实例化为A<bool>::A(A<bool>)——也就是参数为值传递的自身类类型的构造函数。
根据C++标准,拷贝构造函数的第一个参数必须是自身类类型的引用(可以附加const/volatile限定符),合法的拷贝构造函数声明示例包括:
A(const A&); A(A&); A(volatile A&); A(const volatile A&);
如果参数是值传递的自身类型,这属于非法的拷贝构造函数声明,编译器必须拒绝这种代码。
编译器行为判断
GCC和MSVC的报错行为完全符合C++标准,而Clang允许这段代码通过是不符合标准的。
对于注释中的A<double> b;,实例化后构造函数是A<double>::A(A<bool>),这个参数类型A<bool>和自身类类型A<double>不同,不属于拷贝构造函数的范畴,因此三大编译器都能正常编译这段代码。
错误信息解读
MSVC的错误信息直接点明了违规点:
<source>(4): error C2652: 'A<bool>': illegal copy constructor: first parameter must not be a 'A<bool>' <source>(4): note: see declaration of 'A<bool>' <source>(6): note: see reference to class template instantiation 'A<bool>' being compiled
这里的关键是“first parameter must not be a 'A
内容的提问来源于stack exchange,提问作者Baki
相关产品推荐
相关产品推荐

