C ++: создание исключения вызывает конструктор копирования?
У нас есть собственный класс ошибок, который используется всякий раз, когда мы генерируем исключение:
class AFX_CLASS_EXPORT CCLAError : public CObject
Он имеет следующий конструктор копирования:
CCLAError(const CCLAError& src) { AssignCopy(&src); } // (AssignCopy is a custom function)
Первоначально он был написан и скомпилирован / связан с MSVC6 (Visual Studio 2003). Я нахожусь в процессе внесения необходимых изменений, чтобы заставить его скомпилировать и связать с MSVC8 + (VS 2008+)
Когда вызывается компоновщик msvc8, я получаю следующую ошибку:
LNK2001: unresolved external symbol "private: __thiscall CObject::CObject(class CObject const &)" (??0CObject@@AAE@ABV0@@Z)
Я понимаю, что говорит мне ошибка: конструктор копирования не определен для некоторого потомка CObject, поэтому он проходит весь путь по дереву наследования до тех пор, пока не достигнет CObject, который как конструктор копирования не определен.
Я впервые увидел ошибку при компиляции библиотеки, которая определяет и сначала выдаетCCLAError
Вот почему я продолжаю, как будто это причина.
Мне удалось устранить ошибку, изменив
throw CCLAError( ... )
в
throw new CCLAError( ... )
а также
catch(CCLAError& e)
{
throw e;
}
в
catch(CCLAError& e)
{
throw;
}
Однако я не понимаю, почему перезапуск перехваченного исключения вызовет конструктор копирования. Я что-то упускаю совершенно очевидно? Впоследствии, почему удаление переменной, содержащей ссылку на перехваченное исключение, приведет к тому, что конструктор копирования не будет вызван?