gpt4 book ai didi

c++ - 使用std::forward与RefRefCast的完美转发

转载 作者:行者123 更新时间:2023-12-01 14:52:07 25 4
gpt4 key购买 nike

感谢您帮助理解std::forward实现。
std::forward和模板函数中标准转换为T &&之间的区别是什么?
至少在此示例中,它们似乎都正确完成了转发工作。
LValue被转发给LValue重载,而RValue被转发给RValue重载。

struct DemoPerfectForwardVsRefRefCast
{
void overloaded(int const &arg) { std::cout << "receive by lvalue\n"; }
void overloaded(int && arg) { std::cout << "receive by rvalue\n"; }

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 &&参数。
那有必要吗?
它比 Actor 表好吗?

最佳答案

总之,为了转发变量,您可以使用简单的转换。引入功能的原因主要是为了使代码更整洁。
但是,除此之外还有一点优势。在大多数情况下,都会调用std::forward的l值变体,因为每个命名变量都是l值。但是在某些特殊情况下,您可能需要转发函数调用结果(例如std::move)。在这种情况下,如果t为左值,则强制转换static_cast<T&&>(std::move(t))将不起作用,因为禁止从r值强制转换为l值。
我认为第二个用例非常少见,但是有可能应该解决。

关于c++ - 使用std::forward与RefRefCast的完美转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62704701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com