Cita:
Iniciado por Eternal Idol No estoy del todo de acuerdo, me parece que el caso que expones es la excepcion a la regla y la optimizacion se produce en la inicializacion con respecto al constructor (en B se llama al constructor copia, en C al constructor por defecto y despues al operarador =). La variable local se usa en este caso que mostras por necesitar hacer una copia del objeto pero en condiciones normales de una asignacion simple no se necesita usar ninguna variable local en lo absoluto, por ejemplo si usara punteros a Human en B y C los constructores serian iguales.
PD. Tambien hay bastante codigo de mas en C por el hecho de que un constructor puede lanzar una excepcion, al optimizar llamando solo al operador de asignacion se omite el manejo de excepciones del constructor de B. El constructor de Human no esta inline, sino verias la asignacion de 0x1EC, directamente no es llamado por B.
Efectivamente, tienes razón.
Pero, aunque no se porque, el codigo generado puede ser diferente. Pero no creo que este codigo sea una exepcion. Este codigo es tipico de lo que enseñamos en francia en el sitio developpez.com: respeta el RAII y tal.
He tenido esta informacion aqui:
http: //w w w.parashift.com /c++-faq-lite/ctors.html#faq-10.6
(quitad los espacios, no tengo 30 mensages, asi que no puedo dar un enlace directamente). M. Cline es uno de los mas gurus del c++ moderno y dice eso:
Cita: In fact, constructors should initialize as a rule all member objects in the initialization list.
traduccion mia:
Cita: De hecho, los constructores deberian inicializar todos los miembros objetos en la lista de inicializacion. Menos una excepcion[...]
Se puede equivocar, no digo, pero hasta ahora, no hemos visto ningun error en su faq.