欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

右值引用

程序员文章站 2022-03-07 16:40:19
右值和右值引用 右值,即可出现在赋值表达式右边,但不能对其应用地址运算符的值。右值包括字面常(C 风格字符手除外,它表示地址)、诸如x+y等表达式以及返回值的函数(条件是该函数返回的不是引用): C++11新增了右值引用,这是使用&&表示的。右值引用可关联到右值。 注意,r2关联到的是当时计算x+y ......

右值和右值引用

右值,即可出现在赋值表达式右边,但不能对其应用地址运算符的值。右值包括字面常(C-风格字符手除外,它表示地址)、诸如x+y等表达式以及返回值的函数(条件是该函数返回的不是引用):
C++11新增了右值引用,这是使用&&表示的。右值引用可关联到右值。

int x = 10;
int y = 23;
int && r1 = 13;
int && r2 = x + y;
double && r3 = std::sqrt(2.0);

注意,r2关联到的是当时计算x+y得到的结果。也就是说r2关联到的是23,即使以后修改了x或y,也不会影响到r2
有趣的是,将右值关联到右值引用导致该右值被存储到特定的位了置,也可以取该位置的地址,也就是说虽然不能将运算符&用于13,但可将其用于r1,通过将数据与特定的地址关联,使得可以通过右值引用来访问该数据。

#include <iostream>
inline double f(double tf)(return 5. 0*(tf-32.0/9.0;);
int main()
{
    using namespace stdi
    double tc=21.5;
    double && rd1 = 7.07;
    double && rd2=1.8 * tc + 32.0;
    double && rd3=f(rd2);
    cout <<"tc value and address: " << tc << "," << &tc <<endl;
    cout <<"rd1 value and address: " << rd1 << "," << &rd1 <<endl;
    cout <<"rd2 value and address: " << rd2 << "," << &rd2 <<endl;
    cout <<"rd3 value and address: " << rd3 << "," << &rd3 <<endl;

    cin.get();
    return 0;
}

该程序的输出如下
tc value and address: 21. 5, 002FF744
rd1 value and address: 7.07, 002FF728
rd2 value and address: 70.7. 002FF70C
rd3 value and address: 21.5 002FF6F0

引入右值引用的主要目的之一是实现移动语义。