℡奉 承 2024-02-20 22:56 采纳率: 33.3%
浏览 6

为什么std::function的模板实参中有形参包就无法进行推导

img

img

有错误标识的一行报错

疑问:为什么std::function的模板实参中有形参包就推导失败?是因为形参包没有被正确展开吗?

请教~

  • 写回答

2条回答 默认 最新

  • GISer Liu 2024-02-20 23:16
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    这个问题涉及到C++模板参数推导的规则以及std::function模板的特性。在C++中,模板参数推导是根据函数参数类型来确定的。当我们尝试将一个带有形参包的函数作为std::function的模板参数时,编译器无法推导出确切的函数类型,因为形参包并没有具体的类型信息。下面是一个简单的例子来说明这个问题:

    #include <functional>
    
    template <typename... Args>
    void foo(Args... args) {}
    
    int main() {
        std::function<void()> func = foo; // 这行报错
        return 0;
    }
    

    以上代码中,foo是一个模板函数,接受可变数量的参数。然而,在尝试将foo赋值给std::function对象时,编译器无法推导出std::function的模板参数,因为无法确定foo的确切类型。为了解决这个问题,我们可以使用std::function的构造函数,明确指定模板参数,如下所示:

    #include <functional>
    
    template <typename... Args>
    void foo(Args... args) {}
    
    int main() {
        std::function<void()> func = std::function<void()>(foo);
        return 0;
    }
    

    通过显式地指定std::function的模板参数为void(),我们解决了模板参数推导失败的问题。

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

    评论

报告相同问题?

问题事件

  • 创建了问题 2月20日

悬赏问题

  • ¥15 matlab中使用gurobi时报错
  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂