某些场景中,我们可能需要限制调用成员函数的对象的类型(左值还是右值),为此 C++11 新添加了引用限定符。所谓引用限定符,就是在成员函数的后面添加 “&” 或者 “&&”,从而限制调用者的类型(左值还是右值)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
using namespace std;
class demo
{
public:
demo(int num) : num(num) {}

int get_num_l() & // 仅左值
{
return this->num;
}

int get_num_r() && // 仅右值
{
return this->num;
}

private:
int num;
};

int main()
{
demo a(10);
cout << a.get_num_l() << endl; // 正确
// cout << move(a).get_num_l() << endl; // 错误

// cout << a.get_num_r() << endl; // 错误
cout << move(a).get_num_r() << endl; // 正确
return 0;
}

const和引用限定符

C++11 标准规定,当引用限定符和 const 修饰同一个类的成员函数时,const 必须位于引用限定符前面。

当 const && 修饰类的成员函数时,调用它的对象只能是右值对象;当 const & 修饰类的成员函数时,调用它的对象既可以是左值对象,也可以是右值对象。无论是 const && 还是 const & 限定的成员函数,内部都不允许对当前对象做修改操作。

1
2
3
4
5
6
7
8
9
// 左值和右值对象都可以调用
int get_num() const &{
return this->num;
}

// 仅供右值对象调用
int get_num2() const && {
return this->num2;
}