确定与std :: function <R(T1,T2)>兼容的函数类型集的规则?

Naw*_*waz 5 c++ templates type-erasure implicit-conversion c++11

假如我有这个,

std::function<int(int,int)> fs;
Run Code Online (Sandbox Code Playgroud)

那么如何确定fs可以初始化的函数集(或函数对象)?

以下哪项是允许的,哪些不允许:

std::function<int(int,int)> fs = [](int, int) { return int(10); };
std::function<int(int,int)> fs = [](char, char) { return char(10); };
std::function<int(int,int)> fs = [](int, short) { return int(10); };
std::function<int(int,int)> fs = [](double, int) { return float(10); };
std::function<int(int,int)> fs = [](int, wchar_t) { return wchar_t(10); };

std::function<int(int,int)> fs = [](const char*, int){ return "string"; };
std::function<int(int,int)> fs = [](const char*, int){ return 10; };
std::function<int(int,int)> fs = [](const char*, int){ return std::string(); };
Run Code Online (Sandbox Code Playgroud)

当然,我可以编译并查看哪个编译好,哪个不编译.但这并不能帮助我理解参数类型和返回类型的变化.我可以在多长时间内使用不同的类型?

换句话说,如果我给出了一个函数(或函数对象),我怎样才能在编译时确定它是否兼容std::function<int(int,int)>?我没什么了解,但我不够自信.

那么请帮助我理解并制定确定兼容的功能类型集的规则std::function<R(T1,T2)>?metaprogramming可以帮助我在这里通知用户,如果他们使用不兼容的功能,会生成很好的错误消息吗?

顺便说一句,第一组似乎是兼容的:http://ideone.com/hJpG3

Pot*_*ter 4

对象(函数指针或函子)必须是可调用的,具有给定的参数类型,即格式fun( declval< Types >() ... )良好并且可以隐式转换为R.

\n\n

特别参见 C++11 \xc2\xa720.8.2;它给出了指向成员的指针等的各种特殊情况。 \xc2\xa720.8.11.2/2 和 20.8.11.2.1/7 将其与std::function构造函数联系起来。

\n