タイプの関数ポインタはbool (*)()変換できますがstd::function<bool()>、同じタイプではないため、変換が必要です。コンパイラがその変換が可能かどうかをチェックする前に、ReturnTとして推論する必要boolがありますが、それを行うには、それが可能な変換であることをすでに知っている必要がありますstd::function<bool()>。これは、推論するまで不可能ReturnTです...問題を参照してください。
また、それをbool(*)()変換することもできると考えてstd::function<void()>くださいstd::function<int()>...どちらを推測する必要がありますか?
この単純化を検討してください。
template<typename T>
struct function
{
template<typename U>
function(U) { }
};
template<typename T>
void foo(function<T>)
{ }
int main()
{
foo(1);
}
コンパイラは、作成したいかどうか、またはfunction<int>それらすべてをいつ作成できるかをどのように知ることができますか?function<char>function<void>int