1

左值引用限定成员函数和非限定成员函数之间有区别吗?如果是这样,它是什么?

即,这两种声明方式func()不同吗?

class Foo
{
  void func();
  void func() &;
};

func()我的意思不是“它们是否足够不同以允许重载解析”,因为显然当两个版本都存在时,上述类不会编译。&我的意思是,编译器在包含与不包含时如何以及为什么会表现不同?

至少有一个区别,即 ref 限定函数(左值或 r 值类型)不能用非 ref 限定函数重载。从目前的标准草案

同名同参数类型列表的成员函数声明,同名同参数类型列表的成员函数模板声明,同模板形参列表中的任何一个都不能重载,但是不是全部,有一个参考限定符。

...但如果这是唯一的区别,为什么要限制?即,为什么不能foo()&&被视为 (unqualified) 的有效覆盖foo()

4

1 回答 1

3

它们不一样。

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

会打电话func()但不会func()&

相似地:

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

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

void func()&意味着它只是对左值的有效调用,而不是右值。

于 2015-06-06T00:44:52.177 回答