📅  最后修改于: 2023-12-03 14:39:56.177000             🧑  作者: Mango
在C++11中引入了ref-qualifiers特性,它可以用来区分成员函数作为左值(被赋值)还是右值(被移动),这为程序员提供了更大的灵活性和控制性。
ref-qualifiers是一个放在成员函数后面的符号,由&
或&&
组成。其中,&
是表示成员函数可以被左值调用(例如a.func()
,其中a
是一个对象),&&
表示成员函数可以被右值调用(例如create_obj().func()
,其中create_obj()
返回一个临时对象)。不使用ref-qualifiers和使用const
修饰符类似,但它们是不同的。
那么ref-qualifiers应用在函数重载中呢?考虑以下示例:
#include <iostream>
class Example {
public:
void func() & {
std::cout << "func() called on l-value" << std::endl;
}
void func() && {
std::cout << "func() called on r-value" << std::endl;
}
};
int main() {
Example obj;
obj.func();
Example().func();
return 0;
}
上述代码定义了一个带有两个成员函数func()
的类Example
,一个用&
限定,一个用&&
限定。在main()
函数中,首先实例化了一个Example
对象obj
,并调用了对象的成员函数func()
。然后,使用一个临时对象(即右值)同样调用func()
。
输出结果如下:
func() called on l-value
func() called on r-value
当func()
被左值调用时,输出的是“func() called on l-value”,而被右值调用时,输出的是“func() called on r-value”。这就说明我们成功使用ref-qualifiers在函数重载中区分出了左值和右值。
通过使用ref-qualifiers,可以让程序员区分成员函数被左值或右值调用。这给我们提供了更大的灵活性和控制性,可以编写更为强大和安全的代码。