如果你有一个函数参数要被移动到函数中的一个变量中,你会希望使用pass by reference而不是pass by value吗?
例如,使用这样的方法有什么好处吗?
void func(T &object2move)
{
T obj{std::move(object2move)};
}
与
void func(T object2move)
{
T obj{std::move(object2move)};
}
除上述情况外,是否只有当你想使用下面的代码时,你才会要 func
来接受一个r值?
void func(T object2move)
{
T obj{object2move};
}
这些问题的答案是否取决于 T
是什么?
如果你的函数一定会从给定的值中移动,那么最好的表达方式就是取一个rvalue-reference参数(T&&
). 这样,如果用户试图直接传递一个l值,他们会得到一个编译错误。而这将迫使他们调用 std::move
直接在l值上,这 显而易见 向读者表明该值将被移动-from。
使用lvalue-reference总是错误的。Lvalue-reference并不绑定xvalues和prvalues(即:可以从它们那里移动的表达式),所以你用这样的接口是在撒谎。