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? auto
Adı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 . Bar
Kullanı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 Foo
engellemez . Foo
Bar
#include <iostream>
. ;-)
f.Baz().i
da 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.