Рассмотрим приведенный ниже код:
struct Foo {
struct Bar;
Foo()
{
Bar bar; // Why isn't Bar an incomplete type?!
}
struct Bar {}; // Full definition
};
// struct Bar {}; // fails to compile due to incomplete type
int main()
{
Foo foo;
}
Он компилируется под минимум двумя компиляторами (gcc5.2, clang3.5). Мой вопрос:
- Почему не
Bar
считается неполным типом в конструктореFoo::Foo
, поскольку я пересылаю его перед конструктором, но полностью использую его внутри конструктора?
Всякий раз, когда я перемещаю Foo::Bar
вне класса, другими словами Bar
становится автономным классом, я получаю ожидаемый
error: aggregate 'Foo:: Bar bar' имеет неполный тип и не может быть определен