Aquí está el pequeño fragmento de código:¿Por qué no se llama al constructor de copia en este caso?
class A
{
public:
A(int value) : value_(value)
{
cout <<"Regular constructor" <<endl;
}
A(const A& other) : value_(other.value_)
{
cout <<"Copy constructor" <<endl;
}
private:
int value_;
};
int main()
{
A a = A(5);
}
Supuse que la producción sería "Constructor regular" (por RHS), seguido de "constructor de copia" para LHS. Así que evité este estilo y siempre declare la variable de clase como A a(5);
. Pero para mi sorpresa en el código anterior, el constructor de copias nunca se llama (Visual C++ 2008)
¿Alguien sabe si este comportamiento es el resultado de la optimización del compilador, o alguna característica documentada (y portátil) de C++? Gracias.
temporal está optimizado, evitando la construcción + copia. Encuentro que es una buena suposición que ningún usuario construirá a partir de parámetros, de manera diferente a lo que se hace. Copiar-construir – jpinto3912
Ver también: http: // stackoverflow.com/questions/1394229/understanding-return-value-optimization-and-returning-temporaries-c –
En g ++, puede deshabilitar esta optimización con la opción -fno-elide-constructors – Fred