使用转发引用时,std :: move是否需要与std :: forward结合使用?

时间:2015-01-07 02:06:51

标签: c++ c++14

使用通用引用时,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值。

2 个答案:

答案 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));
}