不是`void f(A <0>,tuple <T*...>)`比`f(a <I>,tuple <T*...>)更专业?

cub*_*l42 14 c++ overloading compiler-errors function c++11

#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*>{});
}
Run Code Online (Sandbox Code Playgroud)

是不是f更专业的第二次超载?g ++ 4.9.2表示调用不明确,clang 3.6.0接受它.哪个编译器是对的?

有趣的是,如果你改变std::tuple<T *...>std::tuple<T...>,G ++是与它的罚款,我不明白.

Col*_*mbo 5

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

该虫仍然存在于树干中,并被@Barry报告为67228.

  • 我提交了[67228](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67228). (3认同)