Wycinanie wyjątków - czy to z powodu wygenerowanego konstruktora kopii?

Naprawiłem właśnie bardzo subtelny błąd w naszym kodzie, spowodowany przecięciem wyjątku, a teraz chcę się upewnić, że dokładnie rozumiem, co się dzieje.

Oto nasza podstawowa klasa wyjątków, klasa pochodna i odpowiednie funkcje:

class Exception
{
public:
  // construction
  Exception(int code, const char* format="", ...);
  virtual ~Exception(void);

  <snip - get/set routines and print function>

protected:
private:
  int mCode;                // thrower sets this
  char mMessage[Exception::MessageLen]; // thrower says this FIXME: use String
};

class Derived : public Exception {
public:
  Derived (const char* throwerSays) : Exception(1, throwerSays) {};
};

void innercall {
  <do stuff>
  throw Derived("Bad things happened!");
}

void outercall {
  try {
    innercall();
  }
  catch(Exception& e)
  {
    printf("Exception seen here! %s %d\n", __FILE__, __LINE__);
    throw e;
  }
}

Błąd polegał oczywiście na tym, że zewnętrzne połączenie kończy się wyrzuceniem wyjątku, a nie pochodnej. Mój błąd spowodowany był wyższymi próbami przechwytywania połączenia w próbie złapania błędu pochodnego.

Teraz chcę się tylko upewnić, że rozumiem - wierzę, że w linii 'throw e' tworzony jest nowy obiekt Exception przy użyciu domyślnego konstruktora kopii. Czy tak naprawdę się dzieje?

Jeśli tak, czy mogę zablokować konstruktorów kopii dla obiektów, które będą rzucane? Naprawdę wolałbym, żeby to się nie powtórzyło, a nasz kod nie ma powodu kopiować obiektów Wyjątków (o których wiem).

Proszę nie komentować faktu, że mamy własną hierarchię wyjątków. To trochę stary projekt, który staram się poprawić (robię duże postępy. Pozbyłem się rodzimej klasy smyczków i wielu rodzimych pojemników.)

AKTUALIZACJA: Żeby było jasne, naprawiłem błąd (zmieniając 'throw e' na 'throw') zanim zadałem pytanie. Szukałem tylko potwierdzenia tego, co się dzieje.

questionAnswers(4)

yourAnswerToTheQuestion