一、引用限定符说明
在C++的发展演进过程中,大家都知道了左值和右值。或多或少的也明白其中的意思,而C++中的引用限定符,就是对(左或右)值对象调用者的类型进行限制的符号,通过在类的成员函数后增加“&”或“&&”来进行控制。
对大多数开发者而言,左值和左值的引用限定符还是很好理解的,毕竟从开始学C++基本就明白这个道理。麻烦的是右值,因为一般情况下,大多数和的开发人员,不会单独的处理右值,即使使用也会是在一些特定的数据转移上,而很难是直接调用这个右值及其内部的成员函数。用的少,就意味着生疏,自然也就懵懵懂懂的了。
引用限定符,所谓引用,可以简单理解为那个引用符号,限定,自然只的是只能按要求使用,左值调用左值限定符的限制函数;右值调用右值限定符的限制函数,当然也包括限定在类成员函数使用(如果不是的话,会有一些意想不到的问题,可参看“c++中的Abominable Function Types”)。
需要特别说明的是,引用限定符不能应用于静态成员函数和友元函数,切记。
二、const与引用限定符
在实际的开发中,有时候需要对成员函数进行控制,防止出现通过成员函数修改类内部成员的现象。这就是开发者经常遇到的常函数,引用限定符同样也可以实现类似的功能,方法与常函数的方式一样。不过提醒一点是,const一定要在引用限定符(&或&&)之前,而不可在其后。具体的用法可参看下面的例程。
三、例程
看一下例程:
class D {
public:
D() {}
void print() { std::cout << "print D obj!" << std::endl; }
D getDObj() const & { return *this; }
D getDObj1() const && {
//d=1;//error
return *this;
}
private:
int d = 0;
};
int main() {
D d;
auto &&cd = d.getDObj();
cd.print();
D dd = d.getDObj();
dd.print();
auto ad = std::move(d).getDObj1();
ad.print();
}
代码非常简单,但也很明了。在没有const限制时,右值的引用限定,只能在右值对象中使用(所以只能用move改变一下 ),否则也会报编译错误。左值引用限定符比较简单,就不赘述了,原理和右值引用限定符一样。
如果有const限制时,右值对象仍然只能调用右值引用限定符的函数;但左值引用限定符的函数,则允许右值对象和左值对象同样调用。和普通的常函数一样,想在const引用限定符函数内对成员变量进行修改,就会报一个只读的错误。
四、总结
在前面的文章“c++中的Abominable Function Types”,其实对引用限定符进行了比较详细的总结。但是发现在使用模糊查询时,无法搜索到这个内容。而且恰巧最近又遇到了一些这方面的代码,所以想了下还是专门总结一篇为好。