Sono stato in qualche modo sorpreso che il seguente codice venga compilato ed eseguito (vc2012 & gcc4.7.2)
class Foo {
struct Bar { int i; };
public:
Bar Baz() { return Bar(); }
};
int main() {
Foo f;
// Foo::Bar b = f.Baz(); // error
auto b = f.Baz(); // ok
std::cout << b.i;
}
È corretto che questo codice venga compilato correttamente? E perché è corretto? Perché posso usare autoun tipo privato, mentre non posso usare il suo nome (come previsto)?
privatec'è una comodità per descrivere le API in un modo che il compilatore può aiutare a far rispettare. Non ha lo scopo di impedire l'accesso al tipo Barda parte degli utenti Foo, quindi non impedisce Fooin alcun modo di offrire tale accesso restituendo un'istanza di Bar.
#include <iostream>. ;-)
f.Baz().iva bene così com'èstd::cout << typeid(f.Baz()).name(). Il codice esterno alla classe può "vedere" il tipo restituitoBaz()se puoi ottenerlo, semplicemente non puoi nominarlo.