1

最近、Visual Studio 11 Developer Preview をインストールしました。スレッドと先物をいじっているうちに、私はこの設定にたどり着きました:

#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 ) (実行時エラーは問題ありません: C++0x の gcc 実験的実装での std::future 例外) (VS 11 エラーメッセージ: http://pastebin. com/F9Xunh2s )

たとえそれが開発者向けのプレビューであっても、このエラーは私には非常に明白であるように見えるので、私は今少し混乱しています。だから私の質問は:

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

2 に答える 2

3

std::future可変長テンプレートであると想定されています。これにより、非同期で呼び出される関数に任意の数の引数を渡すことができます。

残念ながら、VS 11 の現在のプレビューは可変個引数テンプレートをサポートしていません。つまり、関数に複数の引数を渡すメカニズムがありません。

結論:VSは間違っています。誰かがこれをバグとして報告したかどうかはわかりませんが、これはすでによく知られている事実の直接的な結果であるため、報告しても間接的に投票を追加する以外に、おそらく多くのメリットはありません/ありません。可変個引数テンプレートが重要であること。

VC++ News pageを見ると、(現在) 調査へのリンクがあり、さまざまな C++11 機能への準拠に割り当てる優先順位を示すことができます。残念ながら、少なくとも現時点ではオフラインのようです。可能な場合は、可変個引数テンプレートを優先度が高いと考えていることを示すために記入すると、少なくともこれに役立つ可能性があります (明らかに何も保証できませんが)。

于 2012-02-22T05:31:59.320 に答える
2

以下のアドホックな回避策を試してください。(Visual Studio 11 Betaで試しました)

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

C++11 標準関数 std::async() には 2 つのオーバーロードがありますが、MSVC/CRT はオーバーロードを正しく解決できません。さらにstd::launch::any、標準の一部ではありません。(必要std::launch::async|std::launch::deferredですが、再度コンパイルすることはできません)

于 2012-03-15T02:57:18.007 に答える