c – 通过通用引用传递的函数的std :: forward吗?

c – 通过通用引用传递的函数的std :: forward吗?,第1张

概述考虑以下两点: template <class Function>void apply(Function&& function){ std::forward<Function>(function)();} 和 template <class Function>void apply(Function&& function){ function();} 在什么情况下有差异, 考虑以下两点:
template <class Function>voID apply(Function&& function){    std::forward<Function>(function)();}

template <class Function>voID apply(Function&& function){    function();}

在什么情况下有差异,它有什么具体的区别?

解决方法 如果Function的operator()具有ref限定符,则会有所不同.使用std :: forward,参数的值类别将被传播,如果没有它,则值类别将丢失,并且函数将始终作为l值调用. Live Example.
#include <iostream>struct Fun {    voID operator()() & {        std::cout << "L-Value\n";    }    voID operator()() && {        std::cout << "R-Value\n";    }};template <class Function>voID apply(Function&& function) {    function();}template <class Function>voID apply_forward(Function&& function) {    std::forward<Function>(function)();}int main () {    apply(Fun{});         // Prints "L-Value\n"    apply_forward(Fun{}); // Prints "R-Value\n"}
总结

以上是内存溢出为你收集整理的c – 通过通用引用传递的函数的std :: forward吗?全部内容,希望文章能够帮你解决c – 通过通用引用传递的函数的std :: forward吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1233630.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存