试图了解是否使用std::forward与auto&&变量是通过这些变量,允许移动的正确途径.
假设有一个功能:
void moveWidget(Widget&& w);
Run Code Online (Sandbox Code Playgroud)
和调用者 - 两个变量来引用rvalue和lvalue:
Widget w;
auto&& uniRefLV = w; // lvalue initialiser,
// uniRefLV's type is Widget&
auto&& uniRefRV = std::move(w); // rvalue initialiser,
// uniRefRV's type is Widget&&
Run Code Online (Sandbox Code Playgroud)
我们知道类型的变量auto&&是通用引用,因为存在类型推导.这意味着双方uniRefRV并uniRefLV都普遍引用.
在我的例子中,显然uniRefRV是rvalue并且uniRefLV是左值,但从概念上讲它们都是通用引用,如果定义不同,它们可以表示rvalue或lvalue.
现在,我想调用moveWidget()并完善这些通用引用类型.该指南(由Scott Meyers撰写)说:
传递和返回右值引用通过
std::move,普遍引用通过std::forward.
除非我完全误解了指南,否则使用起来似乎合乎逻辑std::forward.但是让我们考虑所有可能的选择: …