单字符意味着什么?
从这里的答案。
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声明的函数,“左值引用cvX
”- 用
&&
ref-qualifier声明的函数的“右值引用cvX
”其中
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的答案现在也包含了所有这些信息。)