Template operador de asignación sobrecargando misterio

Tengo una estructura simpleWrapper, distinguido por dos sobrecargas del operador de asignación con plantilla:

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;
  }
};

Luego declaro a y b:

Wrapper<float> a, b;
a = b;

asignaciónb aa utilizará la sobrecarga del operador de asignación con plantilla no constante desde arriba, y se muestra el número "2".

o que me desconcierta es esto: si declaroc yd,

Wrapper<float> c;
const Wrapper<float> d;
c = d;

y asignard ac, ninguna de las dos sobrecargas del operador de asignación se utiliza y no se muestra ninguna salida; entonces se invoca el operador de asignación de copia predeterminado. ¿Por qué asignard ac no utiliza el operador de asignación sobrecargado const proporcionado? O, en cambio, ¿por qué asignarb aa n usa el operador de asignación de copia predeterminado?

Respuestas a la pregunta(2)

Su respuesta a la pregunta