说我有以下功能
void doWork(Widget && param) // param is an LVALUE of RRef type
{
Widget store = std::move(param);
}
为什么我需要将param
强制转换为std::move()
的右值? param
的类型是不是很明显,因为它在函数签名中被声明为右值引用?不应该仅仅根据这个原则自动调用移动构造函数吗?
为什么默认情况下不会发生这种情况?
答案 0 :(得分:23)
与您的设计:
void doWork(Widget && param)
{
Widget store1 = param; // automatically move param
Widget store2 = param; // boom
Widget store_last = param; // boom
}
目前的设计:
void doWork(Widget && param)
{
Widget store1 = param; // ok, copy
Widget store2 = param; // ok, copy
Widget store_last = std::move(param); // ok, param is moved at its last use
}
所以这里的道德是,即使你有一个右值参考,你有一个名称,这意味着你可以多次使用它。因此,您无法自动移动它,因为您可能需要它以供以后使用。