この問題自体はstd::async()、操作の結果を定義するときに、すべての引数が'edでstd::async()使用されます。は任意の型を取り、それらを転送してある場所に保存するため、これは合理的です。それらを保存するには、関数オブジェクトと引数の値が必要です。したがって、次のように使用されます。std::result_of<...>::typestd::decay<...>::typestd::async()std::result_of<...>
typedef std::result_of<void (*(int))(int&)>::type result_type;
...そして、intにバインドできないためint&(int左辺値型ではなく、バインドする必要があるint&)、これは失敗します。この場合の失敗はstd::result_of<...>、ネストされた が定義されていないことを意味しますtype。
フォローアップの質問は次のようになります: インスタンス化に使用されるこの型は何std::result_of<...>ですか? これは、関数呼び出し構文ResultType(ArgumentTypes...)が乱用されているという考え方です。結果の型の代わりに、関数型が渡されstd::result_of<...>、指定された引数のリストでその関数型が呼び出されたときに呼び出される関数の型を決定します。関数ポインター型の場合、それほど興味深いものではありませんが、関数型は、オーバーロードを考慮する必要がある関数オブジェクトにすることもできます。したがって、基本的にstd::result_of<...>は次のように使用されます。
typedef void (*function_type)(int&);
typedef std::result_of<function_type(int)>::type result_type; // fails
typedef std::result_of<function_type(std::reference_wrapper<int>)>::type result_type; //OK