У меня есть простая структура 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;
}
};
Затем я объявляю a и 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
, а не используется оператор копирования по умолчанию?