Вопросы
Я тут давеча решил полистать cppreference.com http://en.cppreference.com/w/cpp/language/function_template, накопилось пара вопросов. Наверняка там же и ответы есть (надо проштудировать Overload resolution, ADL, и сотню дополнительных ссылок, которые накопятся при чтении вышеназванных :) ), но там голые цитаты из стандарта, ухватить суть не всегда просто (читать буду, кончено). Может просто поговорим, глядишь, и прояснится чего-нибудь.
1.
template<class...> struct Tuple { };
template<class... T> void f(Tuple<T...>); // #1
template<class... T> void f(Tuple<T&...>); // #2
template<class... T> void q(T...); // #3
template<class... T> void q(T&...); // #4
int main()
{
f(Tuple<>{}); // calls #2
// но почему-то
q(); // call to 'q' is ambiguous
}
template< class T > void f(T); // #1
template<> void f(int*); // #2
template< class T > void f(T*); // #3
f(new int(1)); // calls #3
// Но если поменять местами #2 и #3, то вызывает #2