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?

questionAnswers(6)

yourAnswerToTheQuestion