dem*_*rge 0 c++ visual-studio-2010 c++11
这可能是编译器相关的(使用VS2010),或者不是,但为什么以下操作不会调用预期的移动行为:
LargeObject x;
x = SomeFunc(x);
Run Code Online (Sandbox Code Playgroud)
我已将该函数定义为该对
LargeObject SomeFunc(const LargeObject& ob)
{
LargeObject newOb;
// perform operation on new object using old object
return newOb;
}
LargeObject SomeFunc(LargeObject&& ob)
{
// change object directly...
return std::move(ob);
}
Run Code Online (Sandbox Code Playgroud)
我明确需要写
x = SomeFunc(std::move(x));
Run Code Online (Sandbox Code Playgroud)
实现它,我不喜欢......
编辑:第一个使用const-ref的函数是因为我还需要做类似的事情
LargeObject x;
LargeObject y = SomeFunc(x);
Run Code Online (Sandbox Code Playgroud)
x
是一个左值,所以当你这样做:
x = SomeFunc(x);
Run Code Online (Sandbox Code Playgroud)
const
选择接受左值引用的重载,因为右值引用不能绑定到左值.如果你想要选择第二个重载,你必须以x
某种方式变成右值.这是做什么的std::move
.
......我不喜欢......
如果将对象传递给函数隐式意味着移动它,我相信你会更喜欢它!
是否执行移动取决于您如何指示编译器.首先,在一般情况下,编译器本身不会(也不能)对您的代码执行语义分析,以确定x
在调用之后是否需要SomeFunc(x)
.
而且,如果以下两条指令在传递参数时导致不同的行为,那将是非常奇怪的:
SomeFunc(x); // Does not move
x = SomeFunc(x); // Moves!?
Run Code Online (Sandbox Code Playgroud)