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

move object into foo(Bar&&) function

我有一个 class Bar 实现了移动构造函数。

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

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

这是为什么?

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

foo(Bar) 的情况下,您按值传递,因此通常会调用复制构造函数。但是,在这种情况下,您有一个移动构造函数,并且正在传递一个右值引用,这要归功于 std::move,因此调用了移动构造函数。