#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*>{});
}
Ist die zweite Überlast von f
nicht spezialisierter? g ++ 4.9.2 sagt, dass der Aufruf mehrdeutig ist, clang 3.6.0 akzeptiert ihn. Welcher Compiler hat Recht?Ist nicht `void f (A <0>, Tupel <T *...>)` spezialisierter als `void f (A <I>, Tupel <T *...>)`?
Es ist interessant, dass, wenn Sie std::tuple<T *...>
zu std::tuple<T...>
ändern, g ++ in Ordnung ist, was ich nicht verstehe.
MSVC 2013 ist auch damit zufrieden :) –
Ich vermute, gcc ist falsch, aber es könnte etwas obskuren Wert Parameter-Parameter (der Standard neigt dazu, um sie herum schrulligen). Können Sie Repo ohne Verwendung von Werten? – Yakk
[clang] (http://clang.llvm.org) ist auch OK mit dem Code. –