¿Por qué el argumento del constructor de copias debería ser constante en C++?

Cuando creamos nuestro propio constructor de copias, pasamos un objeto por referencia y generalmente lo pasamos como una referencia constante. 
Una razón para pasar la referencia const es que deberíamos usar const en C++ siempre que sea posible para que los objetos no se modifiquen accidentalmente. Esta es una buena razón para pasar referencia como const, pero hay más. Por ejemplo, prediga la salida del siguiente programa C++. Suponga que el compilador no realiza la elisión de copia .
 

C

#include<iostream>
using namespace std;
 
class Test
{
   /* Class data members */
public:
   Test(Test &t) { /* Copy data members from t*/}
   Test()        { /* Initialize data members */ }
};
 
Test fun()
{
    cout << "fun() Called\n";
    Test t;
    return t;
}
 
int main()
{
    Test t1;
    Test t2 = fun();
    return 0;
}

Producción: 

 Compiler Error in line "Test t2 = fun();" 

El programa se ve bien a primera vista, pero tiene un error de compilación. Si agregamos const en el constructor de copias, el programa funciona bien, es decir, cambiamos el constructor de copias al siguiente. 
 

C

Test(const Test &t) { cout << "Copy Constructor Called\n"; }

O si cambiamos la línea “Test t2 = fun();” para seguir dos líneas, entonces también el programa funciona bien.
 

C

Test t2;
t2 = fun();

En los códigos anteriores, ¿qué está sucediendo realmente?

Se ejecuta pero no se llama al constructor de copia, sino que llama al constructor predeterminado donde el operador de asignación está sobrecargado. Incluso si tenemos un operador de asignación sobrecargado explícito, no lo llamará. 

La función fun() devuelve por valor. Entonces, el compilador crea un objeto temporal que se copia en t2 usando el constructor de copia en el programa original (el objeto temporal se pasa como argumento al constructor de copia). El motivo del error del compilador es que los objetos temporales creados por el compilador no se pueden vincular a referencias no constantes y el programa original intenta hacerlo. No tiene sentido modificar los objetos temporales creados por el compilador, ya que pueden morir en cualquier momento. 
Este artículo ha sido compilado por Abhay Rathi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *