Jest to podobne do question, ale bardziej konkretny przypadek. Tym razem żaden kompilator nie działa zgodnie z oczekiwaniami.Odliczanie argumentów szablonów dla parametru typu wskaźnika funkcji zawierającego nieopublikowany pakiet parametrów
template<class T>
struct nondeduced
{
using type = T;
};
template<class T>
using nondeduced_t = typename nondeduced<T>::type;
template<class... T, class U>
void f(void(*)(nondeduced_t<T>..., U)) {}
void g(int, char) { }
int main()
{
f<int>(g); // error?
}
W powyższym przykładzie, opakowanie parametr T
nie można wywnioskować, ale kompilator powinien móc wyprowadzić U
po wyraźne argumenty podstawieniem opakowanie T
(to pojedynczy int
w tym przypadku).
Oczekuje się, że wyżej pracować bez nondeduced_t
sztuczki, a także:
template<class... T, class U>
void f(void(*)(T..., U)) {}
Ponieważ opakowanie parametr T
już w nie-wywnioskować kontekście według [temp.deduct.type]p5
Non-wywnioskować są to:
- Parametr funkcji r paczka, która nie występuje na końcu listy deklaracji parametrów.
Niestety, nie testowałem kompilator (g ++/dzyń) zaakceptować kod. W szczególności coś jak poniżej działa zarówno na g ++ & clang.
template<class... T>
void f(void(*)(nondeduced_t<T>..., char)) {}
I znowu, to nie działa na oba:
template<class... T>
void f(void(*)(T..., char)) {}
Czy moje oczekiwanie nie tak?
Ktoś pomóż mi się trochę nauczyć. Myślałem, że 'szablon void f (void (*) (nondeduced_t ..., U)) {}' było źle sformułowane, ponieważ pakiet parametrów variadic pojawia się jako pierwszy . –
AndyG
@AndyG from cppreference: [W szablonie podstawowej klasy, pakiet parametrów szablonu musi być końcowym parametrem na liście parametrów szablonu. W szablonie funkcji pakiet parametrów szablonu może pojawić się wcześniej na liście pod warunkiem, że wszystkie poniższe parametry można wyprowadzić z argumentów funkcji lub mają domyślne argumenty] (http://en.cppreference.com/w/cpp/language/ parameter_pack) – jaggedSpire
Wygląda na to, że nie jest to jednoznacznie określone przez specyfikację –