通过 value/reference 传递将在函数内移动的参数
Pass by value/reference for a parameter that will be moved within function
如果您有一个函数参数要移动到函数内的一个变量中,您是否希望使用按引用传递而不是按值传递?
例如,使用
有什么好处吗?
void func(T &object2move)
{
T obj{std::move(object2move)};
}
对比
void func(T object2move)
{
T obj{std::move(object2move)};
}
除上述之外,当您只想 func
接受一个右值时,您想要使用以下代码的唯一情况是什么?
void func(T object2move)
{
T obj{object2move};
}
这些问题的答案是否取决于 T
是什么?
如果您的函数肯定会偏离给定值,那么最好的表达方式是采用右值引用参数 (T&&
)。这样,如果用户试图直接传递一个左值,他们将得到一个编译错误。这迫使他们直接在左值上调用 std::move
,这 明显地 向 reader 表明该值将从
移出。
使用左值引用总是错误的。左值引用不绑定到 xvalues 和 prvalues(即:可以从它们移动的表达式),所以你有点在说这样一个接口。
如果您有一个函数参数要移动到函数内的一个变量中,您是否希望使用按引用传递而不是按值传递?
例如,使用
有什么好处吗?void func(T &object2move)
{
T obj{std::move(object2move)};
}
对比
void func(T object2move)
{
T obj{std::move(object2move)};
}
除上述之外,当您只想 func
接受一个右值时,您想要使用以下代码的唯一情况是什么?
void func(T object2move)
{
T obj{object2move};
}
这些问题的答案是否取决于 T
是什么?
如果您的函数肯定会偏离给定值,那么最好的表达方式是采用右值引用参数 (T&&
)。这样,如果用户试图直接传递一个左值,他们将得到一个编译错误。这迫使他们直接在左值上调用 std::move
,这 明显地 向 reader 表明该值将从
使用左值引用总是错误的。左值引用不绑定到 xvalues 和 prvalues(即:可以从它们移动的表达式),所以你有点在说这样一个接口。