Byłem zaskoczony, że w jakiś sposób następujący kod kompiluje i działa (vc2012 & gcc4.7.2)Dlaczego mogę używać auto na prywatnym?
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;
}
Czy to prawda, że ten kod kompiluje grzywny? I dlaczego jest poprawny? Dlaczego mogę używać auto
na prywatnym typie, podczas gdy ja nie mogę używać jego nazwy (zgodnie z oczekiwaniami)?
zauważyć, że 'f.Baz() I' jest OK, jak to' std :: cout << typid (f.Baz()). name() '. Kod spoza klasy może "zobaczyć" typ zwracany przez 'Baz()' jeśli możesz go zdobyć, po prostu nie możesz go nazwać. –
A jeśli uważasz, że to dziwne (co prawdopodobnie robisz, widząc, że o to pytasz) nie jesteś jedyny;) Ta strategia jest bardzo przydatna w takich rzeczach jak [idiom Safe-Bool] (http: // www. .artima.com/cppsource/safebool.html). –
Sądzę, że należy pamiętać, że "prywatny" służy jako udogodnienie w opisywaniu interfejsów API w taki sposób, w jaki kompilator może pomóc w egzekwowaniu. Nie ma to na celu uniemożliwienia dostępu do typu 'Bar' przez użytkowników' Foo', więc nie przeszkadza to 'Foo' w oferowaniu tego dostępu przez zwracanie instancji' Bar'. –