使用通用引用时,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中,我不在乎它是l值引用还是r值引用。当然,我在这里不需要const
值。
答案 0 :(得分:2)
如果您想要移动参数的值类别的 ,则move
就足够了。在这种情况下,forward
是多余的,因为move(forward(x))
总是一个右值,无论forward(x)
是什么。
如果您只想移动,具体取决于bar
的参数是否为右值,您应该自己使用forward
,这会传播值类别。
答案 1 :(得分:0)
/!\ BEWARE /!\
使用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));
}