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