今天,我发现这段代码不能像我期望的那样工作。根据我对L-值的了解,应调用复制构造函数,而对于R-值,则应选择移动构造函数。否则,std::move的目的是什么,它实际上只做R-值的转换。我原以为return obj会调用复制构造函数,但它会调用move。我知道这个副本在这里是没用的,但那是关于规则的。如果我的复制构造函数有副作用,这就是我的情况(我知道它不应该,但在技术上它可以--例如这里: std::cout调用)。有什么标准允许这样的行为吗?另外,我怎样才能强制复制?
#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();
}移动式 移动式
发布于 2017-07-26 20:13:04
来自优先选择 (重点雷):
如果返回的表达式是lvalue表达式,并且符合或将满足复制省略的条件,则除了返回的表达式命名函数参数外,还将执行两次重载解析,以选择用于初始化返回值的构造函数:第一,将返回的表达式视为rvalue表达式(因此,它可以选择引用的移动构造函数或副本构造函数),如果没有适当的转换,则使用lvalue 返回表达式执行第二次重载解析。即使函数返回类型与返回表达式类型不同,也适用上述规则
长话短说,return含蓄地试图在有意义的时候移动返回的内容。它将仅作为最后手段进行复制(例如,没有可用的移动构造函数)。
https://stackoverflow.com/questions/45336433
复制相似问题