我有一个实现移动构造函数的类Bar
。
对于实例Bar b
,如果我使用void fooRvalRef(Bar&&)
调用fooRvalRef(std::move(b))
,则不会调用Bar的移动构造函数。
另一方面,对于函数void foo(Bar)
,使用foo(std::move(b))
调用它会调用Bar的移动构造函数。
为什么?
答案 0 :(得分:3)
std::move
尝试将参数转换为右值参考,只要它完成,它就不会移动对象。由于它在fooRvalRef
调用中成功,因此不需要移动构造函数,它只是将rvalue引用传递给rvalue-reference参数。
在foo(Bar)
的情况下,您通过值传递,通常会调用复制构造函数。但是在这种情况下,你有一个移动构造函数,并且你传递一个右值引用,感谢std::move
,所以调用了移动构造函数。