Para este programaC++ constructor de copia, los temporales y la semántica copia
#include <iostream>
using std::cout;
struct C
{
C() { cout << "Default C called!\n"; }
C(const C &rhs) { cout << "CC called!\n"; }
};
const C f()
{
cout << "Entered f()!\n";
return C();
}
int main()
{
C a = f();
C b = a;
return 0;
}
la salida que recibo es:
Entered f()!
Default C called!
CC called!
Desde f()
está regresando por valor, que debe devolver un temporal. Como T a = x;
es T a(x);
, ¿no llamaría al constructor de copia para la construcción de a
, con el pass-in temporal como argumento?
Uso GCC, y con '-fno-elide-constructors' ¡mostró exactamente lo que está pasando debajo del capó! A veces estas optimizaciones confunden mucho a un alumno :) Sin embargo, estoy de acuerdo en que deberían estar activados por defecto, ya que de nuevo la creación de una persona desinformada se optimizará por defecto. – legends2k
@ legends2k: RVO es demasiado útil para dejarlo a los caprichos de los usuarios.Además, este es uno de los pocos casos en que el estándar permite una optimización. Eso revitaliza por qué se deja encendido. Sin embargo, tenga en cuenta que esto no es cierto para otras optimizaciones en general. – dirkgently
De acuerdo, punto tomado. – legends2k