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
相关产品推荐
相关产品推荐

