You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++17/20中如何使用std::invoke_result_t替代C++14的std::result_of_t

问题原因

你犯了语法混用的错误,std::invoke_result_t 和 std::result_of_t 的模板参数传递规则完全不同:

  • std::result_of_t 的入参要求是函数类型格式,即 std::result_of_t<可调用类型(参数类型列表)>,你原来C++14的写法是符合这个规则的
  • std::invoke_result_t 的入参要求是将可调用类型、参数类型分开传递,即 std::invoke_result_t<可调用类型, 参数类型1, 参数类型2, ...>,不需要用括号拼成函数类型格式

你直接把std::result_of_t的参数写法套到std::invoke_result_t上,相当于只给std::invoke_result_t传入了一个函数类型作为唯一模板参数,自然无法推导出预期的void类型。

修正方案

把类型定义行修改为如下写法即可:

// C++17起不需要额外加typename,invoke_result_t已经是别名模板
using ReturnType = std::invoke_result_t<std::decay_t<Callback>, std::decay_t<Args>...>;
补充说明
  • std::result_of 从C17开始被标记为废弃,C20正式移除,官方标准推荐所有场景统一使用std::invoke_result系列接口
  • 修正语法后,std::invoke_result_t的推导结果和原std::result_of_t完全一致,不会影响原有逻辑的运行效果

内容的提问来源于stack exchange,提问作者xeeyu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 07:45:05