单字符意味着什么?

从这里的答案。

class wrap { public: operator obj() const & { ... } //Copy from me. operator obj() && { ... } //Move from me. private: obj data_; }; 

我知道&&表示当对象是右值引用时,成员将被调用。 但是,单个&符号是什么意思? 和没有&符号有什么不同?

这意味着当对象是一个左值引用时,该成员将被调用。

[C++11: 9.3.1/5]:非静态成员函数可以用ref-qualifier (8.3.5)声明; 见13.3.1。

[C++11: 13.3.1/4]:对于非静态成员函数,隐式对象参数的types为

  • 对于不带ref-qualifier或带有& ref-qualifier声明的函数,“左值引用cv X
  • && ref-qualifier声明的函数的“右值引用cv X

其中X是函数所属的类, cv是成员函数声明中的cv限定[..]

(还有一些我找不到的规则)

如果没有ref限定符 ,可以始终调用该函数,而不pipe调用它的expression式的值类别如何:

 struct foo { void bar() {} void bar1() & {} void bar2() && {} }; int main() { foo().bar(); // (always fine) foo().bar1(); // doesn't compile because bar1() requires an lvalue foo().bar2(); foo f; f.bar(); // (always fine) f.bar1(); f.bar2(); // doesn't compile because bar2() requires an rvalue } 

现场演示 (感谢Praetorian)

但是,单个&符号是什么意思?

该函数只能在左值上调用,而不能在右值上调用。

和没有&符号有什么不同?

没有ref-qualifier,你可以在左值右值调用函数。

有了ref-qualifier,你只能调用相应的值类别的函数。

rvalue和lvalues都可以调用没有ref限定符的函数。 带有&& ref-qualifier的函数只能为rvalues调用。 带有& ref-qualifier的函数只能用于左值。

 class No { void foo(); }; class L { void foo() &; }; class R { void foo() &&; }; No().foo(); // valid No no; no.foo(); // valid L().foo(); // invalid L l; l.foo(); // valid R().foo(); // valid R r; r.foo(); // invalid 

不幸的是,我只能在5.5 / 6中find这个规则,它只适用于指向成员的解引用expression式。 我知道它也适用。

而且,你不能在ref-qualifier和ref-qualifier上重载,参见13.1 / 2第3项。你可以在& vs &&上重载。

(由于我没有成功search标准,LRiO的答案现在也包含了所有这些信息。)