首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解移动语义

理解移动语义
EN

Stack Overflow用户
提问于 2014-03-31 13:56:11
回答 2查看 161关注 0票数 0

我正试着把我的头放在移动语义学上。特别是,我想知道如何创建“只移动”类型。以下是我的尝试:

代码语言:javascript
复制
class Movable {
    Movable(const Movable&) = delete;
    Movable &operator=(Movable &) = delete;

public:
    Movable() { }
    Movable(Movable&& rhs) { cout << "mov constructor called" << endl; }
    Movable &operator=(Movable &&rhs) { cout << "Mov assignment called" << endl; return *this; }
};

int main() {

    // (1) This works correctly
    Movable mov_constructored = ([]{
        return Movable();
    })();

    // (2) Why do I have to explicity use std::move?
    Movable mov_assigned = std::move(mov_constructored);

    // (3) The last line fails because it's trying to use the copy constructor.
    // Is it possible to pass by mov?
    mov_assigned = std::move(([](Movable mov_passed){
        return mov_passed;
    })(mov_constructored));
}

我的主要问题是(1)为什么#2要求我明确表示我想移动而不是复制?似乎默认行为是,如果没有复制构造函数,则使用移动构造函数(假设它存在)。除非显式声明move语义,否则实际行为似乎就会失败。

问题(2)从本质上讲,什么是传递移动对象的正确方法?通过引用传递是唯一正确的方法(因为移动语义可能只与赋值/返回值相关?)或者是否有一种将对象“移动”到函数中的实际方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-31 14:01:52

1),因为move_constructed是一个lvalue,所以它尝试调用lvalue辅助。我们使用std::move()将lvalue引用强制转换为rvalue引用(注意,std::move()不会移动,它只是一个强制转换)。

2),问题是move_constructed是一个lvalue,因此使用它的复制ctor初始化了by-value参数。如果您传递一个rvalue (或者使用std::move()将lvalue强制转换为rvalue ),则该调用应该可以工作,因为because参数是使用移动ctor初始化的。(见注)

注意:自C++11以来,我更喜欢讨论lvalue构造函数rvalue构造函数,而不是经典的复制构造函数和C++11移动构造函数。我认为这种措辞使理解lvalue vs rvalue/move语义变得简单:

经典的复制ctor只是一个构造函数,使用一个lvalue来初始化一个对象。因为它是一个lvalue,所以我们不能窃取它的资源,因为它可能的值稍后会被使用。所以我们得复制它。

move ctor就是,它是一个构造函数,它需要一个rvalue来初始化对象。因为它是一个rvalue,所以我们可以安全地窃取它的数据/资源,因为rvalue稍后将超出范围。

票数 6
EN

Stack Overflow用户

发布于 2014-03-31 14:12:30

在C++11中,它的工作方式正好相反--如果它不能移动,它就会返回到复制。复制被认为是更安全的操作,而移动被认为是更快的操作。因此,在适用的情况下,移动将尝试获得性能,但将回落到副本。如果你有这样的声明:

代码语言:javascript
复制
Movable mov_assigned = mov_constructored;

然后,这将显式地请求一个副本,而移动并不是一个安全的副本替代方案。C++程序员不会期望在该语句之后更改mov_constructored

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22763491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档