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

带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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 19:47:16