Главный недостаток - все. Форвардные объявления являются компромиссом для экономии времени компиляции и позволяют иметь циклические зависимости между объектами. Однако стоимость заключается в том, что вы можете использовать тип только в качестве ссылок и ничего не можете сделать с этими ссылками. Это означает, что нет наследования, нет передачи его как значения, нет использования вложенного типа или typedef в этом классе и т. Д. Это все большие недостатки.
Конкретная проблема уничтожения, о которой вы говорите, заключается в том, что если вы только перенаправляете объявление типа и удаляете его только в модуле, поведение не определено и ошибка не выдается.
Например:
class A;
struct C
{
F(A* a)
{
delete a; // OUCH!
}
}
Microsoft C ++ 2008 не вызывает деструктор и выдает следующее предупреждение:
warning C4150: deletion of pointer to incomplete type 'A'; no destructor called
: see declaration of 'A'
Таким образом, вы должны быть начеку, что не должно быть проблемой, если вы воспринимаете предупреждения как ошибки.