De alguma forma, fiquei surpreso que o código a seguir seja compilado e executado (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;
}
É correto que esse código seja compilado corretamente? E por que isso está correto? Por que posso usar auto
em um tipo privado, enquanto não posso usar seu nome (conforme o esperado)?
private
existe uma conveniência para descrever APIs de uma maneira que o compilador possa ajudar a impor. Ele não tem como objetivo impedir o acesso ao tipo Bar
pelos usuários de Foo
, portanto, não impede de Foo
forma alguma oferecer esse acesso retornando uma instância de Bar
.
#include <iostream>
. ;-)
f.Baz().i
também está OK, como estástd::cout << typeid(f.Baz()).name()
. O código fora da classe pode "ver" o tipo retornadoBaz()
se você puder se apossar dela, simplesmente não poderá nomeá-lo.