强制转换为右值

在C++11中,标准库在<utility>中提供了一个有用的函数std::move,这个函数的名字具有迷惑性,因为实际上std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而我们可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:

static_cast<T&&>(lvalue);

值得一提的是,被转化的左值,其生命期并没有随着左右值的转化而改变。

#include <iostream>
using namespace std;

class Moveable{
public:
    Moveable():i(new int(3)) {}
    ~Moveable() { delete i; }
    Moveable(const Moveable & m): i(new int(*m.i)) { }
    Moveable(Moveable && m):i(m.i) {
        m.i = nullptr;
    }
    int* i;
};

int main() {
    Moveable a;

    Moveable c(move(a));    // 会调用移动构造函数
    cout << *a.i << endl;   // 运行时错误
}

上例中,我们为类型Moveable定义了移动构造函数。这个函数定义本身没有什么问题,但调用的时候,使用了Moveable c(move(a));这样的语句。这里的a本来是一个左值变量,通过std::move将其转换为右值。这样一来,a.i就被c的移动构造函数设置为指针空值。由于a的生命期实际要到main函数结束才结束,那么随后对表达式*a.i进行计算的时候,就会发生严重的运行时错误(此处为了说明std::move()的特点:将一个左值强制转化为右值引用)。

调用move就意味着承诺:除了对a赋值或销毁它外,我们将不再使用它。

原文地址:https://www.cnblogs.com/Stephen-Qin/p/9082190.html

时间: 2024-10-07 20:05:32

强制转换为右值的相关文章

C++11 std::move 强制转换为右值

[1]std::move 在C++11中,标准库在<utility>中提供了一个有用的函数std::move. 这个函数的名字很具有迷惑性,因为实际上std::move并不能移动任何东西,它唯一的功能:将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义. 从实现上讲,std::move基本等同于一个类型转换: static_cast<T&&>(lvalue); [2]应用注意项 (1)被std::move转化的左值,其生命期并没有随着转化而改

【转载】C++ 11中的右值引用

本篇随笔为转载,原博地址如下:http://www.cnblogs.com/TianFang/archive/2013/01/26/2878356.html 右值引用的功能 首先,我并不介绍什么是右值引用,而是以一个例子里来介绍一下右值引用的功能: #include <iostream>    #include <vector>    using namespace std; class obj    {    public :        obj() { cout <&l

格式工厂(四) 右值引用

版权声明:本文为博主原创文章,未经博主允许不得转载. 由于右值所产生的临时变量问题一直是一种诟病,C++11中引入了右值引用这个核心语言机制,来提升运行期性能. 首先我先说明一下什么是左值和右值: 左值和右值都是针对表达式而言的,左值是指表达式结束后依然存在的持久对象,右值是指表达式结束时就不再存在的临时对象 int b = 20; //这里b是左值 20是右值 ,因为这个表达式过后 20将不存在了 而b依然存在 //同时也可以根据能否取地址来判断是否是左值(能取地址)还是右值(不能取地址),如

C++ 11 中的右值引用

C++ 11 中的右值引用 右值引用的功能 首先,我并不介绍什么是右值引用,而是以一个例子里来介绍一下右值引用的功能: #include <iostream>    #include <vector>    using namespace std; class obj    {    public :        obj() { cout << ">> create obj " << endl; }        obj(c

[转]C++11 左值、右值、右值引用详解

https://blog.csdn.net/hyman_yx/article/details/52044632 左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值.在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没有名字的就是右值(将亡值或纯右值).举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址:表达式b+c.函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名

Effective Modern C++:05右值引用、移动语义和完美转发

移动语义使得编译器得以使用成本较低的移动操作,来代替成本较高的复制操作:完美转发使得人们可以撰写接收任意实参的函数模板,并将其转发到目标函数,目标函数会接收到与转发函数所接收到的完全相同的实参.右值引用是将这两个不相关的语言特性连接起来的底层语言机制,正是它使得移动语义和完美转发成了可能. 23:理解std::move和std::forward std::move并不进行任何移动,std::forward也不进行任何转发.这两者在运行期都无所作为,它们不会生成任何可执行代码.实际上,std::m

C++11特性之右值引用

title: 右值引用与移动语义 date: 2019-2-24 15:06:34 tags: 学习 categories: 日常 --- 什么是右值?在C++中,一种被广泛认可的说法是,不能取地址,没有名字的就是右值,通常位于等号右边,相反,位于等号左边的,能取地址,有名字的被称为左值. a = b + c 例如上式中,a就是个左值,b+c则是右值. C++11又将右值分为纯右值和将亡值.纯右值包括:不跟对象关联的字面值,一些运算表达式(如1+3).将亡值是跟右值引用相关的表达式,比如右值引用

右值引用与转移语义(C++11)

参考资料: http://www.cnblogs.com/lebronjames/p/3614773.html 左值和右值定义: C++( 包括 C) 中所有的表达式和变量要么是左值,要么是右值.通俗的左值的定义就是非临时对象(可以取地址,有名字),那些可以在多条语句中使用的对象.所有的变量都满足这个定义,在多条代码中都可以使用,都是左值.右值是指临时的对象,它们只在当前的语句中有效.请看下列示例 : 1. 简单的赋值语句 如:int i = 0; 在这条语句中,i 是左值,0 是临时值,就是右

C++11的右值引用

右值引用是C++11         引入的新特性.它解决了两类问题:实现移动语义和完美转发.本文大绝大部分内容,来自于文章:http://kuring.me/post/cpp11_right_reference/ 一:左值(lvalue)和右值(rvalue) 最初,在C中,左值和右值的定义如下:左值,是一个可以出现在赋值操作符左边或者右边的表达式:而右值是只能出现在赋值操作符右边的表达式.比如: int a = 42; int b = 43; // a and b are both l-va