完美前进使用 std::forward vs RefRefCast



感谢您帮助理解std::forward实现。

std::forward 和模板函数中的标准强制转换为 T&& 有什么区别? 至少在这个例子中,它们似乎都正确地完成了转发工作。 LValue 被转发到 LValue 重载,RValue 被转发到 RValue 重载。

struct DemoPerfectForwardVsRefRefCast
{
void overloaded(int const &arg) { std::cout << "receive by lvaluen"; }
void overloaded(int && arg) { std::cout << "receive by rvaluen"; }
template< typename t >
void forwarding(t && arg) {
std::cout << "via std::forward: ";
overloaded(std::forward< t >(arg));  // forwards correctly
std::cout << "via && cast: ";
overloaded(static_cast<t&&>(arg)); // seems to also forward correctly
}
void demo()
{
std::cout << "initial caller passes rvalue:n";
forwarding(5);
std::cout << "initial caller passes lvalue:n";
int x = 5;
forwarding(x);
}
};

通用参考+参考折叠+静态投射到T&&&足够吗?

在Visual Studio 2017中,std::forward的定义以不同的方式实现,有两个模板函数,一个带有T&参数,另一个带有T&&参数。 有必要吗? 比演员阵容好吗?

总之,为了转发一个变量,你可以使用一个简单的强制转换。引入函数的原因主要是使代码更简洁。

但是,除此之外还有一点优势。在绝大多数情况下,将调用std::forward的 l 值变体,因为每个命名变量都是一个 l 值。但在某些特殊情况下,您可能希望转发函数调用结果(例如std::move(。在这种情况下,如果 t 是左值,则转换static_cast<T&&>(std::move(t))将不起作用,因为禁止从 r 值转换为 l 值。

我相信第二个用例非常罕见,但是应该涵盖这种可能性。

最新更新