C ++: Wyrzucenie wyjątku wywołuje konstruktor kopii?

Mamy niestandardową klasę błędów, która jest używana zawsze, gdy rzucamy wyjątek:

class AFX_CLASS_EXPORT CCLAError : public CObject

Ma zdefiniowany następujący konstruktor kopii:

CCLAError(const CCLAError& src) { AssignCopy(&src); } // (AssignCopy is a custom function)

Pierwotnie został napisany i skompilowany / połączony z MSVC6 (Visual Studio 2003). Jestem w trakcie wprowadzania niezbędnych zmian, aby skompilować i połączyć z MSVC8 + (VS 2008+)

Gdy wywoływany jest linker msvc8, pojawia się następujący błąd:

LNK2001: unresolved external symbol "private: __thiscall CObject::CObject(class CObject const &)" (??0CObject@@AAE@ABV0@@Z)

Rozumiem, co mówi mi ten błąd: żaden konstruktor kopiowania nie jest zdefiniowany dla jakiegoś dziecka CObject, więc przechodzi aż do drzewa dziedziczenia, dopóki nie trafi do CObject, który jak nie zdefiniował konstruktor kopii.

Po raz pierwszy zobaczyłem błąd podczas kompilowania biblioteki, która definiuje i najpierw zgłasza aCCLAErrordlatego postępuję tak, jakby to była przyczyna.

Byłem w stanie rozwiązać błąd, zmieniając

throw CCLAError( ... )

do

throw new CCLAError( ... )

i

catch(CCLAError& e)
{
   throw e;
}

do

catch(CCLAError& e)
{
   throw;
}

Nie rozumiem jednak, dlaczego ponowne zgłoszenie złapanego wyjątku wywoła konstruktora kopii. Czy brakuje mi czegoś zupełnie oczywistego? Następnie dlaczego usunięcie zmiennej zawierającej odwołanie do złapanego wyjątku spowoduje, że konstruktor kopii nie zostanie wywołany?

questionAnswers(6)

yourAnswerToTheQuestion