首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移动在返回时调用的构造函数,而不是复制

移动在返回时调用的构造函数,而不是复制
EN

Stack Overflow用户
提问于 2017-07-26 20:06:37
回答 1查看 920关注 0票数 1

今天,我发现这段代码不能像我期望的那样工作。根据我对L-值的了解,应调用复制构造函数,而对于R-值,则应选择移动构造函数。否则,std::move的目的是什么,它实际上只做R-值的转换。我原以为return obj会调用复制构造函数,但它会调用move。我知道这个副本在这里是没用的,但那是关于规则的。如果我的复制构造函数有副作用,这就是我的情况(我知道它不应该,但在技术上它可以--例如这里: std::cout调用)。有什么标准允许这样的行为吗?另外,我怎样才能强制复制?

代码语言:javascript
复制
#include <iostream>

class X
{
public:
    X() = default;

    X(const X& r): i(r.i)
    {
        std::cout << "copy ctor" << std::endl;
    }

    X(const X&& r): i(r.i)
    {
        std::cout << "move ctor" << std::endl;
    }
    int i = 0;
};

X foo()
{
    X obj;
    obj.i = 10;
    return obj;
}

int main()
{
    X x = foo();
}

移动式 移动式

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-26 20:13:04

来自优先选择 (重点雷):

如果返回的表达式是lvalue表达式,并且符合或将满足复制省略的条件,则除了返回的表达式命名函数参数外,还将执行两次重载解析,以选择用于初始化返回值的构造函数:第一,将返回的表达式视为rvalue表达式(因此,它可以选择引用的移动构造函数或副本构造函数),如果没有适当的转换,则使用lvalue 返回表达式执行第二次重载解析。即使函数返回类型与返回表达式类型不同,也适用上述规则

长话短说,return含蓄地试图在有意义的时候移动返回的内容。它将仅作为最后手段进行复制(例如,没有可用的移动构造函数)。

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

https://stackoverflow.com/questions/45336433

复制
相关文章

相似问题

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