从这里的答案.
class wrap {
public:
operator obj() const & { ... } //Copy from me.
operator obj() && { ... } //Move from me.
private:
obj data_;
};
Run Code Online (Sandbox Code Playgroud)
我知道&&
当对象是右值引用时,将调用该成员的方法.但单个&符号是什么意思?与没有&符号有什么不同?
Lig*_*ica 51
这意味着当对象是左值引用时将调用该成员.
[C++11: 9.3.1/5]:
可以使用ref-qualifier声明非静态成员函数(8.3.5); 见13.3.1.
[C++11: 13.3.1/4]:
对于非静态成员函数,隐式对象参数的类型是
- "左值参考CV
X
"为没有声明的函数REF-限定符或与&
REF-限定符- 对于使用ref-qualifier 声明的函数的"rvalue对cv的 引用
X
"&&
where
X
是函数所属的类,cv是成员函数声明的cv-qualification.[..](还有一些我找不到的规则)
如果没有ref-qualifier,则无论您调用它的表达式的值类别如何,都可以始终调用该函数:
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
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*ely 27
但单个&符号是什么意思?
该函数只能在左值上调用,而不能在右值上调用.
与没有&符号有什么不同?
如果没有ref-qualifier,您可以在左值或右值上调用该函数.
使用ref-qualifier,您只能在相应的值类别上调用该函数.
可以为rvalue和lvalues调用没有ref-qualifier的函数.&&
只能为rvalues调用带有ref-qualifier的函数.&
只能为左值调用具有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
Run Code Online (Sandbox Code Playgroud)
不幸的是,我只能在5.5/6中找到这个规则,它只适用于指向成员的解引用表达式.我知道它也适用.
此外,你不能在ref-qualifier和ref ref-qualifier上重载,参见13.1/2 bullet 3.你可以在&
vs上重载&&
.
(由于我对标准的无用搜索,LRiO的答案现在也有了所有这些信息.)
归档时间: |
|
查看次数: |
3500 次 |
最近记录: |