29

std::thread新しい c++11インターフェイスを使用する際に問題が発生しました。スレッドが実行する関数へ
の参照を渡す方法がわかりません。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 に答える