成员函数声明的参数列表后的单个&符号是什么意思?

49 c++ c++11

这里的答案.

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)

现场演示 (感谢Praetorian)

  • @ clin18你不能使用带有没有它的函数的ref-qualifier重载函数.你要么两个都没有. (12认同)
  • 我没有足够的信心发表答案,因为我没有使用ref-qualifiers,但是我认为将其遗漏允许在rvalue或lvalue上调用成员函数,而添加它会将调用限制为相应的值类别.http://coliru.stacked-crooked.com/a/9ae326e4f2a8ae31 (7认同)

Jon*_*ely 27

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

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

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

如果没有ref-qualifier,您可以在左值右值上调用该函数.

使用ref-qualifier,您只能在相应的值类别上调用该函数.

  • 可能是最好,最清晰的答案; +1 (3认同)

Seb*_*edl 9

可以为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的答案现在也有了所有这些信息.)