Entah bagaimana saya terkejut bahwa kode berikut mengkompilasi dan menjalankan (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;
}
Apakah benar kode ini mengkompilasi dengan baik? Dan mengapa itu benar? Mengapa saya bisa menggunakan auto
tipe pribadi, sementara saya tidak bisa menggunakan namanya (seperti yang diharapkan)?
private
ada kemudahan untuk menggambarkan API dengan cara yang dapat dikompilasi oleh kompiler. Itu tidak dimaksudkan untuk mencegah akses ke tipe Bar
oleh pengguna Foo
, jadi itu tidak menghalangi Foo
dengan cara apapun dari menawarkan akses itu dengan mengembalikan instance Bar
.
#include <iostream>
. ;-)
f.Baz().i
juga OK, seperti apa adanyastd::cout << typeid(f.Baz()).name()
. Kode di luar kelas dapat "melihat" jenis yang dikembalikan olehBaz()
jika Anda dapat memperolehnya, Anda tidak dapat menyebutkannya.