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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:57:45