У меня есть простая структура Wrapper
, отличающаяся двумя шаблонными перегрузками оператора присваивания:
template<typename T>
struct Wrapper {
Wrapper() {}
template <typename U>
Wrapper &operator=(const Wrapper<U> &rhs) {
cout << "1" << endl;
return *this;
}
template <typename U>
Wrapper &operator=(Wrapper<U> &rhs) {
cout << "2" << endl;
return *this;
}
};
Затем я объявляю и b:
Wrapper<float> a, b;
a = b;
присвоение b
к a
будет использовать неконстантную шаблонную перегрузку оператора присваивания сверху, и отображается число «2».
Что меня озадачивает, так это это: Если я объявлю c
и d
,
Wrapper<float> c;
const Wrapper<float> d;
c = d;
и назначу d
на c
, ни одна из двух перегрузок оператора присваивания не будет используется, и вывод не отображается; поэтому вызывается оператор присваивания копии по умолчанию. Почему при присвоении d
c
не используется предоставленный перегруженный оператор присваивания const? Или вместо этого почему при присвоении b
a
не используется оператор присваивания копии по умолчанию?