Почему конструктор шаблона предпочтительнее копировать конструктор?

#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?
}

coliru

Перегрузка шаблона конструктора подходит для обоих объявлений (u2 и u3). Но когда int передается в конструктор, выбирается не шаблонная перегрузка. Когда вызывается конструктор копирования, выбирается перегрузка шаблона. Насколько я знаю, не шаблонная функция всегда предпочтительнее шаблонной функции во время разрешения перегрузки. Почему конструктор копирования обрабатывается по-другому?

27
задан TylerH 13 September 2019 в 14:58
поделиться