为什么传递给线程函数的对象引用参数不能编译?

我遇到了使用新的c ++ 11 std::thread接口的问题。
我不知道如何将一个std::ostream的引用传递给线程将执行的函数。

下面是一个传递整数的例子(在gcc 4.6下按照预期编译和工作):

 void foo(int &i) { /** do something with i **/ std::cout << i << std::endl; } int k = 10; std::thread t(foo, k); 

但是当我尝试传递一个ostream它不会编译:

 void foo(std::ostream &os) { /** do something with os **/ os << "This should be printed to os" << std::endl; } std::thread t(foo, std::cout); 

有没有办法做到这一点,或者根本不可能?

NB:从编译错误,它似乎来自一个已删除的构造函数…

线程复制他们的论点(想想看,这是正确的事情)。 如果你想显式引用,你必须用std::ref (或者std::cref作为常量引用)来包装它:

 std::thread t(foo, std::ref(std::cout)); 

(引用包装器是一个包含引用周围的值语义的包装器,也就是说,你可以复制包装器,所有的副本将包含相同的引用。

像往常一样,只要您引用的对象保持活动状态,此代码就是正确的。 买者自负。

 void foo(intstd::ostream &os) 

看起来不像对我有效的C ++。