tengo una estructura sencilla Wrapper
, que se distingue por dos sobrecargas de operadores de asignación con plantilla:Plantilla operador de asignación sobrecarga misterio
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;
}
};
continuación, declaro a y b:
Wrapper<float> a, b;
a = b;
asignar b
-a
utilizará la sobrecarga del operador de asignación de plantilla no const desde arriba, y se muestra el número "2".
Lo que me intriga es la siguiente: Si Declaro c
y d
,
Wrapper<float> c;
const Wrapper<float> d;
c = d;
y asigno a d
c
, se utiliza ninguno de los dos sobrecargas de operadores de asignación, y no se muestra ninguna salida; por lo que se invoca el operador de asignación de copia predeterminado. ¿Por qué la asignación de d
a c
no utiliza el operador de asignación de sobrecarga const proporcionado? O bien, ¿por qué la asignación de b
a a
no usa el operador de asignación de copia predeterminado?
+1 por * Una plantilla de operador no suprime la generación del operador de asignación de copias implícitamente declarado *. – Nawaz