Скопируйте конструктор класса шаблона
Я читал, что шаблон 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>
,