2012-02-22 6 views
1

私は最近、Visual Studio 11 Developer Previewをインストールしました。スレッドや先物で遊んでいる間に、私はこのセットアップに来た:VS 11 with std :: future - これはバグですか?

#include <future> 
#include <iostream> 

int foo(unsigned a, unsigned b) 
{ 
    return 5; 
} 

int main() 
{ 
    std::future<int> f = std::async(foo, 5, 7); 
    std::cout << f.get(); 
} 

とても簡単。しかし、 "foo"には2つの引数があるので、VS 11はそれをコンパイルしたくありません。 (い++ただし、G:http://ideone.com/ANrPj)を(ランタイムエラーが問題ありません:std::future exception on gcc experimental implementation of C++0x)(VS 11にErrorMessage:http://pastebin.com/F9Xunh2s

このエラーもそれならば、私には非常に明白なようですので、私は、今少し混乱しています開発者のプレビューです。だから私の質問は次のとおりです:

  • このコードはC++ 11の標準に従って正しいですか?
  • このバグは既に知られているか報告されていますか?

答えて

2

次の回避策をお試しください。

std::future<int> f = std::async(std::launch::any, foo, 5, 7); 

を(私は、Visual Studio 11ベータ版で試してみました)として、C++ 11の標準機能のstd ::非同期()は、2つのオーバーロードがありますが、MSVC/CRTは正しいオーバーロードの解決を行うことはできません。さらにstd::launch::anyは標準の一部ではありません。 (std::launch::async|std::launch::deferredが必要ですが、再度コンパイルできません)

+0

バグレポートが見つかりました:http://connect.microsoft.com/VisualStudio/feedback/details/729760/std-async-fails-compilation-for-callable-with-two-or-arguments – yohjp

3

std::futureは可変長テンプレートであると考えられる。これは、非同期に呼び出される関数に任意の数の引数を渡すことを可能にするものです。

残念ながら、VS11の現在のプレビューはバリデーションテンプレートをサポートしていません。つまり、関数に複数の引数を渡す仕組みがありません。

ボトムライン:VSが間違っています。誰かがこれをバグとして報告しているのかどうかは分かりませんが、それはすでによく知られている事実の直接的な結果です。したがって、それを報告することは間接的に投票を追加する以外バリデーショナルなテンプレートが重要です。

VC++ News pageを見ると、(現在)さまざまなC++ 11の機能に準拠させるための優先順位を示す調査を行うためのリンクがあります。残念ながら、少なくとも現時点ではオフラインになっているようです。可能であれば、バリデーショナルテンプレートを検討することを示すためにそれを記入して、優先順位を高くすることは、少なくとも何らかの良いことをする可能性がある(明らかに何も保証することはできないが)。

+0

ありがとうございました。ライブラリの実装者は、通常、最大8個の引数を使用することができるように、バリデーショナルテンプレートの不足をハッキングします。私は今なぜstd :: asyncのためにそれをしなかったのだろうかと思います。 – cooky451

+3

明白な回避策:lambda: 'std :: async([&] {foo(5、7);})'を使用してください。 VSチームがその部分に多くの努力を払わなかった主な理由の1つかもしれません。 – Xeo