You need to enable JavaScript to run this app. C++ std::thread编译报错‘参数转右值后不可调用’问题排查
优惠活动
大模型
产品
解决方案
定价
更多

C++ std::thread编译报错‘参数转右值后不可调用’问题排查

编译错误根因

报错的核心触发点是创建线程的代码写法错误:
原错误代码行:
tv.emplace_back((fill_the_vec, std::ref(v2d[i]), c));

  • 外层圆括号把三个参数包裹成了C++的逗号表达式:逗号运算符会按顺序执行左侧所有表达式,最终仅返回最右侧表达式的结果。
  • 上述代码的括号内部分执行后,最终返回值是整数类型的c,相当于给std::thread构造函数只传了一个int值,完全没有传入要求的可调用对象,因此触发std::thread arguments must be invokable after conversion to rvalues的编译错误。
修正方案

删掉参数外层多余的圆括号,将可调用对象、函数参数按顺序传入即可,修正后的代码行:
tv.emplace_back(fill_the_vec, std::ref(v2d[i]), c);

代码相关注意点
  • 使用std::ref包裹v2d[i]是必要操作:std::thread默认会拷贝所有传入参数,而fill_the_vec需要接收左值引用,未包装的情况下会触发额外编译错误。
  • 当前代码逻辑下,你在创建线程前已经完成了二维vector所有行的初始化,且每个线程独立操作不同的行元素,不存在同一块内存的并发写入、vector扩容导致的迭代器失效问题,不需要额外添加互斥锁做保护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 08:57:04