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 auto
un tipo privato, mentre non posso usare il suo nome (come previsto)?
private
c'è 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 Bar
da parte degli utenti Foo
, quindi non impedisce Foo
in alcun modo di offrire tale accesso restituendo un'istanza di Bar
.
#include <iostream>
. ;-)
f.Baz().i
va 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.