l值ref ref限定成员函数和不合格成员函数之间是否存在差异?如果是这样,它是什么?
即,这两种声明func()
不同的方式是什么?
class Foo
{
void func();
void func() &;
};
我的意思是"它们是否足够不同以允许重载解决,"因为很明显,当func()
的两个版本都存在时,上面的类不会编译。我的意思是,当包含&
时,编译器的行为方式和原因是什么?为什么?
至少有一个区别,即ref-qualified函数(l值或r值类型)不能使用非ref-qualified函数重载。来自current standard draft:
具有相同名称和相同的成员函数声明 parameter-type-list以及成员函数模板 具有相同名称的声明,相同的参数类型列表和 相同的模板参数列表,如果有的话,不能重载,但不能 所有,都有一个参赛资格。
......但如果这是唯一的区别,为何限制?即,为什么不能将foo()&&
视为(不合格)foo()
的有效覆盖?
答案 0 :(得分:3)
他们是不同的。
Foo foo;
std::move(foo).func();
将致电func()
,但不会func()&
。
类似地:
Foo make_foo() { return {}; }
make_foo().func();
仅适用于void func()
签名,而不是void func()&
签名。
void func()&
表示它只是对左值而不是右值的有效调用。