У меня есть следующий код:
#include <iostream>
using namespace std;
template<typename T> class myclass {
public:
T data;
myclass(T const & _data = T()) : data(_data) {}
template<typename U> myclass<T> & operator=(myclass<U> const & rhs) {
cout << data << " = " << rhs.data << endl;
return *this;
}
};
int main() {
myclass<double> first(1);
myclass<float> second(2);
myclass<double> third(3);
first=second;
first=third;
}
Теперь, хотя он компилируется отлично, вывод только:
1 + 2
Почему не первый = третий звонит
myclass<double> & operator=(myclass<double> const & rhs)
?
Оператор назначения копирования никогда не является шаблоном функции. Поскольку класс не объявляет оператор присваивания копии, компилятор генерирует его и использует этот сгенерированный оператор. Если вы добавите такой оператор, вы увидите назначение:
myclass<T>& operator= (myclass<T> const& rhs) {
std::cout << "(copy) " << data << " = " << rhs.data << '\n';
return *this;
}
Оператор копирования-назначения никогда не является шаблоном. Поскольку вы не определили его, для вас определена версия по умолчанию (которая ничего не печатает).