2011-11-28 9 views
28

新しい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:コンパイルエラーから

+0

プリミティブの場合:http://stackoverflow.com/questions/5116756/difference-between-pointer-and-reference-as-thread-parameter –

答えて

44

スレッドコピーその引数...削除されたコンストラクタから来ているようだ(それは正しいことだ、それについて考えます)。あなたが明示的に参照したい場合は、std::ref(または一定の参照用std::cref)でそれをラップする必要があります。

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

(基準ラッパーが参照付近の値のセマンティクスを持つラッパーですつまり、あなたがコピーすることができます。ラッパー、すべてのコピーには同じ参照が含まれます)。

いつものように、このコードはあなたが参照するオブジェクトが生存している限り、正しいです。買い手責任負担。

+2

おそらくポインタで渡しますか? –

+21

@JohnDibling:もしあなたがマゾヒストで、あなたのCにプラスプラスが多すぎると思うなら、そうです。 –

+0

私はマゾヒズム的な傾向があると思います。 –

-3
void foo(intstd::ostream &os) 

私には有効なC++のようには見えません。

+7

それは私にとっては正しいようです...ちょうど珍しい名前空間:P – AkiRoss

関連する問題