Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将向量元素的引用传递给线程函数_C++_Multithreading_C++11_Vector_Reference - Fatal编程技术网

C++ 将向量元素的引用传递给线程函数

C++ 将向量元素的引用传递给线程函数,c++,multithreading,c++11,vector,reference,C++,Multithreading,C++11,Vector,Reference,我正在尝试这样做: #include <thread> #include <vector> void foo(bool &check){ } int main(){ std::vector<bool> vec(1); std::thread T(foo, std::ref(vec[0])); } 但是,它适用于正常变量: bool var; std::thread(foo, std::ref(var)); 我不知道为什么我不能

我正在尝试这样做:

#include <thread>
#include <vector>

void foo(bool &check){

}

int main(){
    std::vector<bool> vec(1);
    std::thread T(foo, std::ref(vec[0]));
}
但是,它适用于正常变量:

bool var;
std::thread(foo, std::ref(var));
我不知道为什么我不能传递对vec元素的引用。有人能解释一下原因吗?有什么解决办法吗?

问题是,您使用的是<代码>运算符[]for
vector
返回的不是bool,而是
std::vector::reference
,即代理类。 您可以使用以下内容:

bool value = vec[0];
std::thread T(foo, std::ref(value));
T.join();
vec[0] = value;
另一个解决方法(未测试)

#包括
#包括
void foo(向量和向量){
//在这里访问v[0]并指定您想要的任何值
//理想情况下,您也可以通过索引
//如果要访问第n个元素
}
int main(){
std::vec(1);
标准::线程T(foo,标准::ref(vec));
}

是否无法将引用直接传递给向量元素?根据您提出的解决方案,我将不得不重写项目的一半。@user3125731不要使用
vector
。运算符[]按副本返回引用,因此不能将其绑定到左值引用。你可以使用移动语义,而不是引用。我不知道为什么这个答案会被否决。聪明的解决方法。通常最简单的方法是,最好的方法是明确地询问如何将向量组件传递给线程,而不是出于某种原因将整个向量传递给线程。
bool value = vec[0];
std::thread T(foo, std::ref(value));
T.join();
vec[0] = value;
#include <thread>
#include <vector>

void foo(vector& v){
  //here access v[0] and assign whatever value you'd like
  //ideally you could pass an index as well
  // if you want to access the Nth element
}

int main(){
    std::vector<bool> vec(1);
    std::thread T(foo, std::ref(vec));
}