c++11 右值引用

2022-11-19  本文已影响0人  arkliu

左值右值

左值是指表达式结束后,依然存在的持久化对象,右值是指,表达式结束后,就不再存在的临时对象,有名字的对象都是左值,右值没有名字

还有一种判断方法就是,\color{red}{看能否对表达式取地址,如果能,则为左值,否则为右值}

class AA {
    int m_a;
};

AA getTmp() {
    return AA();
}

int main() {
    int ii = 3;  // ii是左值, 3是右值
    int jj = ii+8; // jj是左值, ii+8是右值
    AA aa = getTmp(); // aa是左值, getTmp()是右值
    return 0;
}

右值引用

右值引用,就是给右值取个名字
语法:

数据类型 && 变量名 = 右值
class AA {
    public:
        int m_a = 9;
};

AA getTmp() {
    return AA();
}

int main() {
    int &&i = 3;// 3是右值
    int b = 10; // b是左值
    int &&c = b+12;  // b+12是右值

    /**
     * getTmp()本来函数返回,返回对象的声明周期就结束了(因为是临时变量),但是使用右值对其引用,因此
     * 返回对象的生命周期就和右值的引用对象aa的生命周期相同了,只要aa还活着,该右值临时变量将会一直存活下去
    */
    AA &&aa = getTmp(); // getTmp()返回值是右值

    cout << i << endl;
    cout << c << endl;
    cout << aa.m_a << endl;
    return 0;
}

一般而言,左值引用只能引用左值,右值引用只能引用右值,但是常量左值引用确是个例外:

int main() {
    int a = 4;
    const int&ra = a; // a是非常量左值

    const int b = 5;
    const int&rb = b; // b是常量左值

    const int&rc = 1; // 1是右值,这里就是左值引用右值
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读