std::move 是否需要在使用转发引用时与 std::forward 结合使用?
Does std::move need to be combined with std::forward when using forwarding references?
使用通用引用时,std::move需要和std::forward结合使用吗?例如下面两段代码,哪一段是正确的?
void bar(auto && x) {
auto y(std::move(std::forward<decltype(x)>(x)));
}
或
void bar(auto && x) {
auto y(std::move(x));
}
基本上,我想将 x 的内存移动到 y 中,我不关心它是左值引用还是右值引用。当然,我不想在此处使用 const
值。
一个 move
就足够了,如果你想移动 而不管参数的值类别 。
forward
在这种情况下是多余的,因为 move(forward(x))
始终是右值,无论 forward(x)
是什么。
如果您只想根据 bar
的参数是否为右值来移动,您应该单独使用 forward
,它会传播值类别。
/!\ 注意 /!\
使用 std::move
作为通用参考可能是一个非常糟糕的主意,强烈建议避免:
auto name = getName(); // std::string getName();
bar(name);
// 'name' value has been moved... And its value now is unknown, empty at best.
move(forward(x))
是糟糕的风格,不应使用。
您应该使用 std::move
作为右值引用,使用 std::forward
作为通用引用。比照。正式定义。
auto&&
是通用参考,因此您应该写成:
void bar(auto&& x) {
auto y(std::forward<decltype(x)>(x));
}
使用通用引用时,std::move需要和std::forward结合使用吗?例如下面两段代码,哪一段是正确的?
void bar(auto && x) {
auto y(std::move(std::forward<decltype(x)>(x)));
}
或
void bar(auto && x) {
auto y(std::move(x));
}
基本上,我想将 x 的内存移动到 y 中,我不关心它是左值引用还是右值引用。当然,我不想在此处使用 const
值。
一个 move
就足够了,如果你想移动 而不管参数的值类别 。 forward
在这种情况下是多余的,因为 move(forward(x))
始终是右值,无论 forward(x)
是什么。
如果您只想根据 bar
的参数是否为右值来移动,您应该单独使用 forward
,它会传播值类别。
/!\ 注意 /!\
使用 std::move
作为通用参考可能是一个非常糟糕的主意,强烈建议避免:
auto name = getName(); // std::string getName();
bar(name);
// 'name' value has been moved... And its value now is unknown, empty at best.
move(forward(x))
是糟糕的风格,不应使用。
您应该使用 std::move
作为右值引用,使用 std::forward
作为通用引用。比照。正式定义。
auto&&
是通用参考,因此您应该写成:
void bar(auto&& x) {
auto y(std::forward<decltype(x)>(x));
}