作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
感谢您帮助理解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 &&是否足够?
最佳答案
总之,为了转发变量,您可以使用简单的转换。引入功能的原因主要是为了使代码更整洁。
但是,除此之外还有一点优势。在大多数情况下,都会调用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/
我是一名优秀的程序员,十分优秀!