为什么不动呢?

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)

And*_*owl 5

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)

  • @demorge:Nonono,编译器应该*不*那样做,这意味着移动不再由对象的值类别(rvalues vs lvalues)触发,而是由代码中对象的未来使用触发.这可能会改变(如果你使用下面的`x` 1000行添加指令怎么办?)相信我,除非你有一个右值,否则你不希望编译器移动.如果你有一个左值,你必须通过告诉编译器"好,我真的知道我在做什么,我正在远离这个对象",明确地将它变成一个右值. (8认同)