C ++: ¿Lanzar una excepción invoca el constructor de copia?
Tenemos una clase de error personalizada que se usa cada vez que lanzamos una excepción:
class AFX_CLASS_EXPORT CCLAError : public CObject
Tiene el siguiente constructor de copia definido:
CCLAError(const CCLAError& src) { AssignCopy(&src); } // (AssignCopy is a custom function)
Originalmente fue escrito y compilado / vinculado con MSVC6 (Visual Studio 2003). Estoy en el proceso de hacer los cambios necesarios para compilarlo y vincularlo con MSVC8 + (VS 2008+)
Cuando se invoca el enlazador msvc8, aparece el siguiente error:
LNK2001: unresolved external symbol "private: __thiscall CObject::CObject(class CObject const &)" (??0CObject@@AAE@ABV0@@Z)
Entiendo lo que me dice el error: no se ha definido ningún constructor de copia para algún hijo de CObject, por lo que va hasta el árbol de herencia hasta que llega a CObject, que no está definido como un constructor de copia.
La primera vez que vi el error al compilar la biblioteca que define y lanza unaCCLAError
, por lo que estoy procediendo como si esa fuera la causa.
Pude resolver el error cambiando
throw CCLAError( ... )
a
throw new CCLAError( ... )
y
catch(CCLAError& e)
{
throw e;
}
a
catch(CCLAError& e)
{
throw;
}
Sin embargo, no entiendo por qué volver a lanzar una excepción capturada invocaría al constructor de copia. ¿Me estoy perdiendo algo completamente obvio? Posteriormente, ¿por qué la eliminación de la variable que contiene una referencia a una excepción detectada hace que no se invoque el constructor de copia?