成员函数声明的参数列表后面的单个"与"是什么意思

What does the single ampersand after the parameter list of a member function declaration mean?

本文关键字:quot 意思 是什么 单个 声明 函数 参数 列表 成员      更新时间:2023-10-16

根据此处的答案。

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

我知道&&意味着当对象是右值引用时,成员将被调用。但是,单安培数是什么意思?它与没有安培数有什么不同?

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

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

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

  • "对cvX的左值引用",适用于未使用ref限定符或使用&ref限定符声明的函数
  • 使用&&ref限定符声明的函数的"对cvX的右值引用">

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

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

如果没有ref限定符,函数总是可以被调用,而不管调用它的表达式的值类别是什么:

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限定符,您可以在左值或右值上调用函数。

使用ref限定符,您只能调用相应值类别上的函数。

一个没有ref限定符的函数可以同时为右值和左值调用。带有&&ref限定符的函数只能为右值调用。带有&ref限定符的函数只能为lvalues调用。

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中找到这个规则,它只适用于指向成员的指针解引用表达式。我知道它也适用于其他情况。

此外,您不能在引用限定符与无引用限定符之间过载,请参阅13.1/2项目符号3。您可以在&&&上过载。

(由于我对标准的搜索没有结果,LRiO的答案现在也包含了所有这些信息。)