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 autoun tipo privado, mientras que no puedo usar su nombre (como se esperaba)?
privateexiste 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 Barpor parte de los usuarios Foo, por lo que no obstaculiza Foode ninguna manera ofrecer ese acceso al devolver una instancia de Bar.
#include <iostream>. ;-)
f.Baz().itambié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.