#include <tuple>
template<int I>
struct A {};
template<int I, typename... T>
void f(A<I>, std::tuple<T *...>) {}
template<typename... T>
void f(A<0>, std::tuple<T *...>) {}
int main()
{
f(A<0>{}, std::tuple<char*, int*, float*>{});
}
f
是不是第二次超载更专业? g ++ 4.9.2说这个调用是模糊的,铿锵3.6.0接受它。哪个编译器是正确的?`不是`void f(A <0>,tuple <T *...>)`比'void f(A <I>,tuple <T *...>)`更专业化吗?
有意思的是,如果你将std::tuple<T *...>
更改为std::tuple<T...>
,那么g ++就没问题了,我不明白。
MSVC 2013也对此感到满意:) –
我怀疑gcc是错误的,但可能有些值模板参数不明确(标准往往会在它们周围变得古怪)。你可以不用价值回购? – Yakk
[clang](http://clang.llvm.org)也可以用代码。 –