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

