C++20类模板拷贝构造函数规则变更?还是GCC的Bug?
C++20模板类构造函数写法的编译错误问题
在第三方库中发现如下代码,该代码在GCC 13.1的C20模式下编译失败,但在其他编译器或C17模式下可正常编译。虽然知道<T>并非必需,但想确认是否是C++20的规则变更导致该代码无效?
template<typename T> struct Foo { Foo<T>(const Foo& other); };
GCC 13.1在C++20模式下的错误信息:
<source>:4:12: error: expected unqualified-id before 'const' 4 | Foo<T>(const Foo& other); | ^~~~~ <source>:4:12: error: expected ')' before 'const' 4 | Foo<T>(const Foo& other); | ~^~~~~ | ) Compiler returned: 1
确实是C++20的规则变更导致这段代码失效。
C17及更早版本中,编译器对类内部构造函数的声明写法比较宽松,允许使用Foo<T>这种带模板实参的形式作为构造函数名。但C20标准收紧了这一语法规则:在类模板的作用域内,构造函数的名字必须直接使用类模板名Foo(无需附加<T>),因为此时Foo已经指代当前实例化的模板类特化版本。
GCC 13.1严格遵循C++20标准,因此会对这种不符合新规则的写法报错。正确的写法应该去掉构造函数名后的<T>:
template<typename T> struct Foo { Foo(const Foo& other); };
内容的提问来源于stack exchange,提问作者florestan
相关产品推荐
相关产品推荐

