为什么传递给线程函数的对象引用参数不能编译?
我遇到了使用新的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 ++。