关于右值引用的一点理解

电子说

1.3w人已加入

描述

>>> 背景

我们知道对于一些C++内建类型来说,ostream类的操作符<<都提供了输出到标准输出流的方法,只需要像下面这样就能输出到终端窗口了。

int num = 1;
string str = "number";
cout < < str < < " is " < < num;

但是对于自建类的话,就需要其他的手段输出想要的内容了。通过重载<<操作符并声明为ostream类的友元是常见的方法。下面就是一种常见的书写范式。

class Persion
{
private:
    string name;
    int age;


public:
    Persion() = delete;
    Persion(string a_name, int a_age) : 
        name(a_name), age(a_age) {}
    friend ostream& operator< < (ostream& os, Persion& per)
    {
        os < < "(lvalue)A persion object with name: " < < per.name < < ", age: " < < per.age;
        return os;
    }
};

>>> 问题

我在使用下面这串代码对重载的效果进行测试的时候,编译器报出了问题,它告诉把右值赋给了要求左值引用的参数。

cout < < Persion("maxwell", 18) < < endl;

C++语言

>>> 解决方案

C++11之后,使用&来声明左值引用,使用&&来声明右值引用。在上述测试语句中,Persion( "maxwell" , 18 )是一个临时变量,属于右值。因此,如果想要上述测试语句通过,还需要对类补充一个右值引用的成员函数。如下所示。

class Persion
{
    // ...
    friend ostream& operator< < (ostream& os, Persion&& per)
    {
        os < < "(rvalue)A persion object with name: " < < per.name < < ", age: " < < per.age;
        return os;
    }
};
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分