为什么将对象引用参数传递给线程函数无法编译?

时间:2011-11-28 17:09:35

标签: c++ c++11 libstdc++

我使用新的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);

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

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

1 个答案:

答案 0 :(得分:50)

线程复制他们的论点(考虑一下,那就是正确的事)。如果您需要显式引用,则必须使用std::ref(或std::cref对其进行常量引用):

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

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

像往常一样,只要您引用的对象保持活动状态,此代码才是正确的。注意事项。