重载没有引用限定符的引用限定成员函数

问题描述 投票:0回答:2

成员函数

f
的非引用限定重载是否符合C++20标准? Clang 和 GCC 似乎都接受它。他们都在拉木棍的短端吗? C++20 标准对此有什么规定?

#include <concepts>

struct s {
    int f(auto...)&;
    void f(auto...); // clang ok, gcc ok, msvc nope
};
static_assert(std::same_as<decltype(s{}.f()), void>);

演示


MSVC 的错误消息:

<source>(5): error C2559: 'void s::f(_T0...)': cannot overload a member function
without ref-qualifier with a member function with ref-qualifier
c++ language-lawyer c++20
2个回答
0
投票

这在 c++20 的发布后草案 [N4868] 中格式不正确。这可以从over.load看出:

具有相同名称、相同参数类型列表([dcl.fct])和相同尾部 require 子句(如果有)的成员函数声明, 以及具有相同名称的成员函数模板声明,相同的参数类型列表、相同的尾随要求子句(如果有)和相同的模板头,如果其中任何一个(但不是全部)具有引用限定符([dcl.fct]),则不能重载.


-1
投票

该标准没有明确禁止同时列出两者,但您没有理由这样做。 重载解析规则指出,在这两种情况下,隐式对象参数都会解析为相同的“对 cv X 的左值引用”,这使得重载解析不明确。

© www.soinside.com 2019 - 2024. All rights reserved.