带ref-qualifier与无ref-qualifier的成员函数重载是否符合C++20标准?
C++20中带ref-qualifier与无ref-qualifier的成员模板重载合法性问题
问题概述
你编写的这段C20代码中,定义了两个重载的成员函数模板:一个带有& ref-qualifier,另一个不带。Clang和GCC均可正常编译,但MSVC报错,需要确认此类重载是否符合标准,以及C20的具体规定。
代码示例
#include <concepts> struct s { int f(auto...)&; void f(auto...); // Clang、GCC编译通过,MSVC报错 }; static_assert(std::same_as<decltype(s{}.f()), void>);
MSVC错误信息(中文翻译)
(5): error C2559: 'void s::f(_T0...)': 无法将不带ref限定符的成员函数与带ref限定符的成员函数重载
标准规定与结论
根据C++20标准:
- ref-qualifier属于函数签名的一部分,这一规则同时适用于普通成员函数和成员函数模板。
- 对于函数模板,只要两个模板的签名(包含ref-qualifier、参数列表等核心要素)存在差异,就允许重载。
你的代码中,两个f函数模板的核心差异正是ref-qualifier的有无,因此它们的签名不同,属于合法的重载场景。Clang和GCC的编译行为符合C++20标准,而MSVC的报错是错误的。
内容的提问来源于stack exchange,提问作者303
相关产品推荐
相关产品推荐

