Si consideri il codice qui sotto:Perché una dichiarazione in linea non è un tipo incompleto?
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;
}
Si compila bene a titolo di almeno 2 compilatori (gcc5.2, clang3.5). La mia domanda è:
- Perché non è
Bar
considerato un tipo incompleto nel costruttoreFoo::Foo
, come ho previsionali dichiaro sopra il costruttore, ma pienamente utilizzare all'interno del costruttore?
Ogni volta che mi muovo Foo::Bar
di fuori della classe, in altre parole Bar
diventa una classe a sé stante, ottengo l'atteso
error: aggregate 'Foo::Bar bar' has incomplete type and cannot be defined
Gli organi delle funzioni membro si comportano come se fossero definiti fuori linea (vale a dire dopo la definizione della classe). –
Il motivo principale è che il compilatore può eseguire la ricerca locale di tutte le definizioni all'interno della classe, quando determina come gestire ciascun tipo. L'ambito è esaminato per intero, dal momento che è solo una piccola parte del tuo programma, e non ha bisogno di fare affidamento sull'ordine delle dichiarazioni nel codice sorgente. – tp1