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?

Respuestas a la pregunta(6)

Su respuesta a la pregunta