29

我在使用新的 c++11std::thread接口时遇到了问题。
我不知道如何将对 a 的引用传递给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);

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

注意:从编译错误看来,它似乎来自已删除的构造函数......

4

1 回答 1

53

线程复制他们的论点(想想看,这是正确的事情)。如果你想要一个明确的引用,你必须用std::ref(或std::cref常量引用)包装它:

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

(引用包装器是在引用周围具有值语义的包装器。也就是说,您可以复制包装器,并且所有副本都将包含相同的引用。)

像往常一样,只要您引用的对象仍然存在,此代码才是正确的。买者自负。

于 2011-11-28T17:11:01.157 回答