Passage d’une référence d’un élément vectoriel à une fonction thread

J’essaie de faire quelque chose comme ça:

#include  #include  void foo(bool &check){ } int main(){ std::vector vec(1); std::thread T(foo, std::ref(vec[0])); } 

Malheureusement, gcc génère une erreur:

 prog.cpp: In function 'int main()': prog.cpp:10:34: error: use of deleted function 'void std::ref(const _Tp&&) [with _Tp = std::_Bit_reference]' std::thread(foo, std::ref(vec[1])) ^ In file included from /usr/include/c++/4.9/thread:39:0, from prog.cpp:1: /usr/include/c++/4.9/functional:453:10: note: declared here void ref(const _Tp&&) = delete; 

Cependant, cela fonctionne avec une variable normale:

 bool var; std::thread(foo, std::ref(var)); 

Je ne sais pas pourquoi je ne peux pas transmettre une référence à l’élément vec. Quelqu’un peut-il expliquer pourquoi? Y at-il une solution de contournement?

Le problème est que vous utilisez std::vector . operator [] pour le vector ne retourne pas bool, mais std::vector::reference , c’est-à-dire une classe proxy. Vous pouvez utiliser quelque chose comme:

 bool value = vec[0]; std::thread T(foo, std::ref(value)); T.join(); vec[0] = value; 

Une autre solution de contournement (non testée)

 #include  #include  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 vec(1); std::thread T(foo, std::ref(vec)); }