error C2679:std::future赋值转换失败的技术咨询
解决error C2679:std::future赋值失败的问题
错误原因分析
你的代码存在两个核心问题:
std::invoke_result用法错误:你在Submit函数中写了std::invoke_result<Task()>::type,这不符合模板参数规则。std::invoke_result第一个参数是可调用对象的类型,后续是调用时的参数类型——你的Task是无参可调用对象,正确写法应为std::invoke_result<Task>::type。错误写法会导致Submit返回的std::future类型与std::future<int>不匹配,触发赋值运算符找不到的错误。向量
Futures未初始化:Futures初始为空,直接用Futures[i]会越界访问,属于未定义行为,同时也会干扰编译器的错误判断。
修正后的代码
#include <future> #include <vector> #include <functional> #include <thread> template<typename Task> std::future<typename std::invoke_result<Task>::type> Submit(Task task) { // 用std::packaged_task创建有效future(实际场景需结合线程池执行) std::packaged_task<typename std::invoke_result<Task>::type()> pt(std::move(task)); auto result = pt.get_future(); std::thread(std::move(pt)).detach(); return result; } struct Mystruct { std::vector<std::future<int>> Futures; int MyFunc(int i) { return i; }; void Run() { Futures.resize(2); // 先初始化向量元素数量 for (int i = 0; i < 2; ++i) { Futures[i] = Submit(std::bind(&Mystruct::MyFunc, this, i)); // 也可以使用lambda: // Futures[i] = Submit([this, i]() { return this->MyFunc(i); }); } } };
补充说明
std::future是不可拷贝的,只能通过移动语义转移所有权,Submit返回的临时对象是右值,可正常触发移动赋值,这部分逻辑本身没问题。- 原代码中Submit返回的是默认构造的空
std::future,实际使用时需要用std::packaged_task或std::async生成有效的future,示例中补充了基础实现逻辑。
内容的提问来源于stack exchange,提问作者ma1169
相关产品推荐
相关产品推荐

