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