#include <iostream>
struct uct
{
uct() { std::cerr << "default" << std::endl; }
uct(const uct &) { std::cerr << "copy" << std::endl; }
uct( uct&&) { std::cerr << "move" << std::endl; }
uct(const int &) { std::cerr << "int" << std::endl; }
uct( int &&) { std::cerr << "int" << std::endl; }
template <typename T>
uct(T &&) { std::cerr << "template" << std::endl; }
};
int main()
{
uct u1 ; // default
uct u2( 5); // int
uct u3(u1); // template, why?
}
Шаблонная перегрузка конструктора подходит для обоих объявлений (u2
и u3
). Но когда int
передается в конструктор, выбирается не шаблонная перегрузка. Когда вызывается конструктор копирования, выбирается перегрузка шаблона. Насколько я знаю, не шаблонная функция всегда предпочтительнее шаблонной функции во время разрешения перегрузки. Почему конструктор копирования обрабатывается по-другому?