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 autotipe pribadi, sementara saya tidak bisa menggunakan namanya (seperti yang diharapkan)?
privateada kemudahan untuk menggambarkan API dengan cara yang dapat dikompilasi oleh kompiler. Itu tidak dimaksudkan untuk mencegah akses ke tipe Baroleh pengguna Foo, jadi itu tidak menghalangi Foodengan cara apapun dari menawarkan akses itu dengan mengembalikan instance Bar.
#include <iostream>. ;-)
f.Baz().ijuga 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.