#include <type_traits>
#include <functional>
//0
template<class R, class... Args>
struct function_traits{};
//1
template<class R, class... Args>
struct function_traits<std::function<R(Args...)>> : function_traits<R(Args...)>{
static_assert(true, "std::function");
};
//2
template<class Callable>
struct function_traits :
function_traits<decltype(&Callable::operator())> {
static_assert(true, "Callable");
};
int main(void)
{
std::function<void()> f0;
function_traits<decltype(f0)> f1;
return 0;
}
希望 24 行的模板推导先匹配 1 再 匹配到 0.
实际上先匹配到 1,然后匹配到 2, 然后就推导失败了。
编译器 MSVC 2017.
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.