将对象移动到foo(Bar&&)函数中

时间:2016-04-17 18:52:28

标签: c++11 move-semantics

我有一个实现移动构造函数的类Bar

对于实例Bar b,如果我使用void fooRvalRef(Bar&&)调用fooRvalRef(std::move(b)),则不会调用Bar的移动构造函数。

另一方面,对于函数void foo(Bar),使用foo(std::move(b))调用它会调用Bar的移动构造函数。

为什么?

1 个答案:

答案 0 :(得分:3)

std::move尝试将参数转换为右值参考,只要它完成,它就不会移动对象。由于它在fooRvalRef调用中成功,因此不需要移动构造函数,它只是将rvalue引用传递给rvalue-reference参数。

foo(Bar)的情况下,您通过值传递,通常会调用复制构造函数。但是在这种情况下,你有一个移动构造函数,并且你传递一个右值引用,感谢std::move,所以调用了移动构造函数。