Скопируйте конструктор класса шаблона

Я читал, что шаблон copy-con никогда не используется по умолчанию для копирования onstructor, а шаблон assignment-op никогда не является оператором копирования.

Я не мог понять, зачем нужно это ограничение, и сразу же подключился к ideone и вернул тестовую программу, но здесь конструктор копирования никогда не вызывается при дальнейшем поиске в Google. Я наткнулся на шаблонизированный конструктор и попробовал это, но все равно он никогда не вызывает конструктор копирования.

#include <iostream>
using namespace std;

template <typename T> class tt
{
    public :
    tt()
    {
        std::cout << std::endl << "   CONSTRUCTOR" << std::endl;
    }
    template <typename U> const tt<T>& operator=(const tt<U>& that){std::cout << std::endl << "   OPERATOR" << std::endl;}
    template <typename U> tt(const tt<U>& that)
    {
        std::cout << std::endl << "    COPY CONSTRUCTOR" << std::endl;
    }
};


tt<int> test(void)
{
    std::cout << std::endl << "      INSIDE " << std::endl; tt<int> a; return a;
}

int main() {
    // your code goes here
    tt<int> a ; a = test();

    return 0;
}

Может кто-нибудь объяснить мне всю причину наложения этого ограничения, а также как написать конструктор копирования класса шаблона.

Спасибо

2 ответа

Решение

Существуют строгие правила, которые составляют конструктор копирования (см. C++11, 12.8):

  • Это не шаблон.

  • Для класса Tего первый аргумент должен иметь тип T & или же T const & или же T volatile & или же T const volatile &,

  • Если он имеет более одного аргумента, дальнейшие аргументы должны иметь значения по умолчанию.

Если вы не объявляете конструктор копирования, конструктор копирования формы T::T(T const &) неявно объявлено для вас. (Это может или не может быть фактически определено, и если это определено, это может быть определено как удаленное.)

(Обычные правила разрешения перегрузки подразумевают, что вы можете иметь не более четырех конструкторов копирования, по одному на каждую CV-квалификацию.)

Существуют аналогичные правила для конструкторов перемещения, с && на месте &,

Я не могу комментировать, почему это так, но вот как вы пишете конструктор копирования и оператор присваивания для шаблона класса:

    template <class T>
    class A
    {
      public:
        A(const A &){}
        A & operator=(const A& a){return *this;}
    };

и это все.
Хитрость здесь в том, что хотя A шаблон, когда вы ссылаетесь на него внутри класса как A (например, в сигнатурах функций) это рассматривается как полный тип A<T>,

Другие вопросы по тегам