#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表示调用不明确,clang 3.6.0接受它。哪个编译器是对的?
有趣的是,如果你将std::tuple<T *...>
更改为std::tuple<T...>
,那么g ++就可以了,我不明白。
答案 0 :(得分:5)
根据现行规则,第二次过载更加专业化。某些具有合成值A<@>
的专精@
无法与A<0>
匹配,但A<0>
可与A<I>
匹配(I=0
)。第一对的不对称是决定性的。无论您使用T
还是T*
作为第二个参数中的模式都是无关紧要的,因为对于该对,推导会成功。
该错误仍然存在于主干中,并由@Barry报告为67228。