C ++: Lançar uma exceção invoca o construtor de cópia?
Temos uma classe de erro personalizada que é usada sempre que lançamos uma exceção:
class AFX_CLASS_EXPORT CCLAError : public CObject
Tem o seguinte construtor de cópia definido:
CCLAError(const CCLAError& src) { AssignCopy(&src); } // (AssignCopy is a custom function)
Ele foi originalmente escrito e compilado / vinculado ao MSVC6 (Visual Studio 2003). Eu estou no processo de fazer as alterações necessárias para obtê-lo para compilar e vincular contra o MSVC8 + (VS 2008+)
Quando o vinculador msvc8 é invocado, recebo o seguinte erro:
LNK2001: unresolved external symbol "private: __thiscall CObject::CObject(class CObject const &)" (??0CObject@@AAE@ABV0@@Z)
Eu entendo o que o erro está me dizendo: nenhum construtor de cópia é definido para algum filho do CObject, então está indo até a árvore de herança até atingir o CObject, que como nenhum construtor de cópia definido.
Eu vi pela primeira vez o erro ao compilar a biblioteca que define e lança primeiro umCCLAError
É por isso que estou procedendo como se essa fosse a causa.
Consegui resolver o erro alterando
throw CCLAError( ... )
para
throw new CCLAError( ... )
e
catch(CCLAError& e)
{
throw e;
}
para
catch(CCLAError& e)
{
throw;
}
No entanto, não entendo por que jogar novamente uma exceção capturada chamaria o construtor de cópia. Estou faltando alguma coisa completamente óbvia? Posteriormente, por que remover a variável que contém uma referência a uma exceção capturada faz com que o construtor de cópia não seja chamado?