左值、右值、左值引用,右值引用,std::move函数 1. 左值和右值 int i = 10; // 对象:一块内存区域 i = 20; // 左值:能用在赋值语句等号左侧的东西,它能够代表 一个地址 // 右值:不能作为左值的就是右值 // 结论:C++ 的一条表达式,要么就是左值,要么就是右值
左值是容器对象,比如 string 对象维护一个 char 数组,当调用vec.push_back(std::move(str)),str 内部维护的 char 数组就被push_back(T&&)拿走(再强调一下,这是push_back(T&&)内部的实现逻辑决定的,与std::move不直接相关),str 维护的 char 数组为 NULL,表现出来的就是str.length() == 0。
std::move的作用就是把一个左值变成一个右值,使其可以调用移动构造 移动语义可以避免资源的重新分配,这个资源除了堆上的内存;还可以是其他,比如数据库的连接,打开的文件操作符等,这些可以在你的移动构造函数内实现。 stl的容器基本都实现了移动语义 std::list<A> alist; ...
五. std::move函数 std::move():C++11从名字上看是一个移动的函数,但实际上,这个函数根本就没有做移动的操作。std::move()的作用只有一个:将一个左值强制转换为一个右值。且书上建议我们,当该左值使用std::move()函数强制类型转换为右值后就不能够再使用该左值去做事情了。 int i = 10; //int&& ri1...
3. 右值引用和std::move的应用场景 按上文分析,std::move只是类型转换工具,不会对性能有好处;右值引用在作为函数形参时更具灵活性,看上去还是挺鸡肋的。他们有什么实际应用场景吗? 3.1 实现移动语义 在实际场景中,右值引用和std::move被广泛用于在STL和自定义类中实现移动语义,避免拷贝,从而提升程序性能。 在没...
std::move非常具有迷惑性,其实std::move根本不做任何move相关的事情,唯一的功能就是左值强制转化为右值...
转换为右值引用的转换函数的调用表达式,比如 std::move(x) 下面是一些左值、右值的简单范例 // 举例intk=1;// k 是左值,可以通过&取k变量对应的地址; 1是右值,无法通过&获取地址inta=2;intb=a+2;// a+2 是临时表达式,右值 2 左值引用与右值引用 ...
int &&d1=std::move(a); //正确,将非常量左值a转换为非常量右值,可以被非常量右值引用绑定 int &&d2=std::move(a1); //错误,将常量左值a1转换为常量右值,不可以被非常量右值引用绑定 //常量右值引用 const int &&c1=std::move(a); //正确,将非常量左值a转换为非常量右值,可以被常量右值引用绑定 ...
右值值引用通常不能绑定到任何的左值,要想绑定一个左值到右值引用,通常需要std::move()将左值强制转换为右值,例如: inta;int&&r1=c;# 编译失败int&&r2=std::move(a);# 编译通过 右值引用的方法就是int * &&rnum = &num1; 。 下面来说一下为什么要右值引用,右值引用在你需要使用寄存器中的值的时候可以...
因为:有些场景下,可能真的需要用右值去引用左值实现移动语义。当需要用右值引用引用一个左值时,可以通过move函数将左值转化为右值。 C++11中,std::move()函数位于 头文件中,该函数名字具有迷惑性,它并不搬移任何东西,唯一的功能就是将一个左值强制转化为右值引用,然后实现移动语义。