1

MSVC 2012 の右辺値参照で問題が発生しました。

#include <thread>
#include <string>
#include <future>

void foo(std::promise<std::string> &&prms) { /* some code */ }

int main() {
  std::promise<std::string> prms;
  // std::future<std::string> ftr = prms.get_future();
  std::thread th(&foo, std::move(prms));

  // some other code
}

コンパイラのメッセージ:エラー C2664: 'void (std::promise<_Ty> &&)' : パラメーター 1 を 'std::promise<_Ty>' から 'std::promise<_Ty> &&' に変換できません

私の間違い(それを修正する方法)またはコンパイラの問題(そのような動作の起源を知りたい)はありますか?

4

1 に答える 1

3

これは、のVisual C++2012実装における既知の問題ですstd::thread。MicrosoftConnectの次のバグを参照してください。

std::threadコンストラクターは可動オブジェクトを処理しません

そのバグへの応答は次のように述べています。

VC11の開発中にこれを修正しようとしましたが、ひどく爆発し、変更を元に戻す必要がありました。bind()結局のところ、スレッドは引数を移動する必要があり、移動することは禁止されているため、std :: threadはによって電力を供給できませんbind()(バインドされたファンクターは、バインドされた引数を移動せずに繰り返し呼び出す必要があるため)。したがって、をstd::thread使用しないように、のctorを再実装する必要がありますbind()

于 2013-01-21T19:03:57.757 に答える