Рассмотрим следующий код:Почему встроенное объявление не является неполным типом?
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;
}
Она компилирует отлично под по меньшей мере, 2 составителей (gcc5.2, clang3.5). Мой вопрос:
- Почему
Bar
не считается неполным типа в конструктореFoo::Foo
, как я вперед объявить его над конструктором, но полностью использовать его внутри конструктора?
Всякий раз, когда я двигаюсь Foo::Bar
вне класса, другими словами Bar
становится самостоятельным классом, я получаю ожидаемый
error: aggregate 'Foo::Bar bar' has incomplete type and cannot be defined
Органы функций-членов действуют так, как если бы они были определены вне линии (т. Е. После определения класса). –
Основная причина заключается в том, что компилятор может выполнять локальный поиск всех определений внутри класса, когда он определяет, как обращаться с каждым типом. Объем рассмотрен полностью, так как это всего лишь небольшая часть вашей программы, и ему не нужно полагаться на порядок объявлений в исходном коде. – tp1