我使用静态struct member技巧来强制执行第二次传递编译并仍然出错:
struct S
{
template <typename T>
static T Sum(T t) {
return t;
}
template <typename T, typename ... Rest>
static auto Sum(T t, Rest... rest) -> decltype(t + Sum(rest...) )
{
return t + Sum(rest...);
}
};
int main()
{
auto x = S::Sum(1,2,3,4,5);
}
main.cpp:17:14:没有匹配函数来调用'Sum'
答案 0 :(得分:4)
即使使用clang 4.0
,编译也会失败。
我设法使用decltype(auto)
(仅auto
也可以)编译它而不是显式尾部返回类型。
struct S
{
template <typename T>
static T Sum(T t) {
return t;
}
template <typename T, typename ... Rest>
static decltype(auto) Sum(T t, Rest... rest)
{
return t + Sum(rest...);
}
};
我认为编译器无法推断类型,因为推导仅取决于递归返回语句。