Спецификация ISO C ++, §15.1 / 3, гласит, что
Тип выражения броска не должен быть неполным типом или указателем или ссылкой на неполный тип, кромеvoid *, const void *, volatile void * или const volatile void *.За исключением этих ограничений и ограничений на сопоставление типов, упомянутых в 15.3, операнд throw обрабатывается в точности как аргумент функции в вызове (5.2.2) или операнд оператора return.
Исходя из этого, кажется, что вы должны иметь возможность выбрасывать все что угодно, если только вы не выбрасываете тип, который вы только объявили вперед.
РЕДАКТИРОВАТЬ : Как указывает @Billy ONeal, тип должен быть копируемым, что означает, что он должен поддерживать конструктор копирования.