De alguna manera me sorprendió que el siguiente código se compile y se ejecute (vc2012 y 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;
}
¿Es correcto que este código se compile bien? ¿Y por qué es correcto? ¿Por qué puedo usar auto
un tipo privado, mientras que no puedo usar su nombre (como se esperaba)?
private
existe una conveniencia para describir las API de una manera que el compilador pueda ayudar a hacer cumplir. No está destinado a evitar el acceso al tipo Bar
por parte de los usuarios Foo
, por lo que no obstaculiza Foo
de ninguna manera ofrecer ese acceso al devolver una instancia de Bar
.
#include <iostream>
. ;-)
f.Baz().i
también está bien, tal como estástd::cout << typeid(f.Baz()).name()
. El código fuera de la clase puede "ver" el tipo devuelto porBaz()
si puede obtenerlo, simplemente no puede nombrarlo.