📜  c++ 通过 ref-qualifiers 重载 - C++ (1)

📅  最后修改于: 2023-12-03 14:39:56.177000             🧑  作者: Mango

C++通过ref-qualifiers重载

在C++11中引入了ref-qualifiers特性,它可以用来区分成员函数作为左值(被赋值)还是右值(被移动),这为程序员提供了更大的灵活性和控制性。

Ref-qualifiers

ref-qualifiers是一个放在成员函数后面的符号,由&&&组成。其中,&是表示成员函数可以被左值调用(例如a.func(),其中a是一个对象),&&表示成员函数可以被右值调用(例如create_obj().func(),其中create_obj()返回一个临时对象)。不使用ref-qualifiers和使用const修饰符类似,但它们是不同的。

重载函数使用ref-qualifiers

那么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,可以让程序员区分成员函数被左值或右值调用。这给我们提供了更大的灵活性和控制性,可以编写更为强大和安全的代码。