C++ C++;11个线程,它是有效代码吗?

C++ C++;11个线程,它是有效代码吗?,c++,multithreading,c++11,C++,Multithreading,C++11,我正在玩C++11的线程功能。但是下面的代码不能在clang(3.5)和gcc(4.9.2)下编译 #包括 #包括 无效添加(int&x){ x+=1; } int main(int argc,char const*argv[] { int x{5}; int y{8}; std::thread my_thread_1{add,x}; std::thread my_thread_2{add,y}; 我的_线程_1.join(); my_thread_2.join(); std::cout它是有效

我正在玩C++11的线程功能。但是下面的代码不能在clang(3.5)和gcc(4.9.2)下编译

#包括
#包括
无效添加(int&x){
x+=1;
}
int main(int argc,char const*argv[]
{
int x{5};
int y{8};
std::thread my_thread_1{add,x};
std::thread my_thread_2{add,y};
我的_线程_1.join();
my_thread_2.join();

std::cout它是有效的,但thread类复制了它的参数,因此不能直接使用引用。必须使用才能使其正常工作:

std::thread my_thread_1{ add, std::ref(x) };

谢谢。看起来比亚恩·斯特劳斯特鲁普的书《C++编程语言,第四版》在第116页上犯了这个错误。这就是为什么我感到非常困惑。我们是否应该添加std::ref甚至用于常量引用?@InsideLoop Use
std::cref
用于常量引用,否则参数将被复制。(我想,除非编译器能够以某种方式对此进行优化)
std::thread my_thread_1{ add, std::ref(x) };