Мне было любопытно, было ли возможно создать два класса, каждый из которых содержит std::vector другого. Мое первое предположение заключалось в том, что это было бы невозможно, потому что std::vector требует полного типа, а не только прямого объявления.
#include <vector>
class B;
class A { std::vector<B> b; };
class B { std::vector<A> a; };
Я бы подумал, что объявление std::vector<B> приведет к немедленному сбою, потому что B имеет неполный тип в этой точке. Тем не менее, он успешно компилируется под gcc и clang без каких-либо предупреждений. Почему это не вызывает ошибку?