将对象移动到 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
,因此调用了移动构造函数。
我有一个 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
,因此调用了移动构造函数。