#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*>{});
}
Il secondo sovraccarico di f
non è più specializzato? g ++ 4.9.2 dice che la chiamata è ambigua, clang 3.6.0 lo accetta. Quale compilatore ha ragione?Non è `void f (A <0>, tupla <T *...>)` più specializzato di `void f (A <I>, tupla <T *...>)`?
È interessante notare che se si modifica std::tuple<T *...>
in std::tuple<T...>
, g ++ funziona correttamente, cosa che non capisco.
MSVC 2013 è soddisfatto anche di questo :) –
Sospetto che gcc sia errato, ma potrebbe esserci qualcosa di oscuro sui parametri del modello di valore (lo standard tende ad essere bizzarro attorno ad essi). Puoi effettuare il repo senza usare valori? – Yakk
[clang] (http://clang.llvm.org) è anche OK con il codice. –