l值ref ref-qualified成员函数和不合格成员函数之间的区别?

时间:2015-06-06 00:39:53

标签: c++ c++11 overload-resolution ref-qualifier

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()的有效覆盖?

1 个答案:

答案 0 :(得分:3)

他们是不同的。

Foo foo;
std::move(foo).func();

将致电func(),但不会func()&

类似地:

Foo make_foo() { return {}; }
make_foo().func();

仅适用于void func()签名,而不是void func()&签名。

void func()&表示它只是对左值而不是右值的有效调用。