Bir şekilde aşağıdaki kodun derlenip çalıştığına şaşırdım (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;
}
Bu kodun düzgün derlenmesi doğru mu? Ve neden doğru? autoAdını (beklendiği gibi) kullanamasam da neden özel bir türde kullanabilirim?
private, derleyicilerin zorlamaya yardımcı olabilecek bir şekilde API'leri tanımlamak için bir kolaylık olması olduğunu düşünüyorum . BarKullanıcıların türüne erişimi önlemesi amaçlanmadığından, bir örneği döndürerek bu erişimi sunmasını hiçbir şekilde Fooengellemez . FooBar
#include <iostream>. ;-)
f.Baz().ida iyi olduğunu gözlemleyinstd::cout << typeid(f.Baz()).name(). Sınıfın dışındaki kodlar, geriBaz()alabileceğiniz tür tarafından döndürülen türü "görebilir", sadece adlandıramazsınız.