右值引用
程序员文章站
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
引入右值引用的主要目的之一是实现移动语义。