2016-08-21 11 views
0

[12]にいくつかのリンクがあります.co_awaitはstd::experimental::optionalで動作し、VS 2015 Update 2はこれをサポートするはずです。 VSは、私が使用してもアップデート3には、オプションを持っていないので 私はgithubから1を使用しますが、このようなコードはコンパイルされません:Visual Studio 2015 Update 3のco_awaitはstd :: experimental :: optionalで動作しますか?

optional<string> get_hope() { 
    if ((rand() % 4) == 0) 
     return nullopt; 
    return "yolo"; 
} 

optional<string> bla() { 
    string s = co_await get_hope(); 
} 

エラーは次のとおりです。

エラー(アクティブ)このco_await式は、適切な 「await_ready」機能を必要とし、どれも私の質問は、私が何か間違ったことをやっているされて

を発見されなかった、のawaitのためのライブラリ行方不明のサポートであるか、コンパイラのミスです co_awaitのこの側面のサポートを歌います。

答えて

2

、インターネット上でいくつかのリンクがco_awaitがSTDで動作する必要があることを示唆している[1,2]がある::実験::オプション

あなたは間違ってこれらのリンクを解釈しています。この誤解を犯すのは間違いなくthis one is essentially designedですが。

P0057 "coroutines"は本質的に、関数が実行を中断し、後でサスペンドポイントから継続する方法です。これを引き起こすメカニズムには、関数の戻り値の型/署名と式の型との間の一連の複雑なやりとりが含まれており、式はco_awaitである。

人々が発見したことは、 ab co_awaitを使用して、条件付きリターンの有効な同等物を実行する方法です。 co_awaitoptionalに適用すると、optionalの状態を確認し、空であればその機能を終了することができます。事実上、co_awaitは機能を中断して(つまり、呼び出し側に制御を戻す)と言うでしょうが、は再開をスケジュールしません。これにより実際にif(opt.empty()) return; else ...を書き込まずに、戻り値(コルーチンをクリーンアップすることを含む)の効果が得られます。これにより、co_awaitは、値が格納されている場合はoptionalから値を解凍できます。

しかし、それはoptionalが存在するので魔法のように起こるだけではありません。 co_awaitco_awaitco_awaitco_await表現タイプとしてoptionalと一緒に機能し、その中で使用される関数の戻り値タイプが何であっても機能する機械を構築する必要があります。

co_awaitのVS2015の実装ではco_awaitstd::futureに設定されています。しかし、それはoptionalまたは他のランダムタイプのサポートを持っていません。あなたはそれを自分で構築しなければならないでしょう。あなたが指摘した投稿はどれも指摘していません。

関連する問題