你的设计:
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
}
所以这里的寓意是,即使你有一个右值引用,你也有一个名称,这意味着你可以多次使用它。因此,您无法自动移动它,因为您可能需要它以备后用。
现在假设您要重新设计语言,以便自动将最后一次使用视为右值。
在上面的例子中很容易做到这一点:
void doWork(Widget && param)
{
Widget store1 = param; // `param` treated as lvalue here, copy
Widget store2 = param; // `param` treated as lvalue here, copy
Widget store_last = param; // `param` treated as rvalue here, move
}
让我们忽略param 处理方式的不一致(这本身就是一个问题)。
现在想想param的最后一次用途是什么:
void doWork(Widget && param)
{
Widget store2 = param; // this can be last use or not
while (some_condition())
{
Widget store1 = param; // this can be both last use and not
}
}
语言根本不能这样设计。