不是f(A&lt; 0&gt;,tuple <t * ... =“”>)`比`f更专业(A <i>,tuple <t * ... =“”> )`?

时间:2015-08-15 13:27:28

标签: c++ function c++11 compiler-errors overloading

#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 ++就可以了,我不明白。

1 个答案:

答案 0 :(得分:5)

根据现行规则,第二次过载更加专业化。某些具有合成值A<@>的专精@无法与A<0>匹配,但A<0>可与A<I>匹配(I=0)。第一对的不对称是决定性的。无论您使用T还是T*作为第二个参数中的模式都是无关紧要的,因为对于该对,推导会成功。

该错误仍然存​​在于主干中,并由@Barry报告为67228

相关问题