Тайна перегрузки оператора присваивания шаблона

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

7
задан user2023370 27 December 2015 в 01:34
поделиться