我有些惊讶于以下代码编译并运行了(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;
}
这段代码是否编译正常?为什么它能够编译成功?我为什么可以在一个私有类型上使用 auto
,而不能使用其名称(如预期的那样)?
f.Baz().i
是可以的,同样std::cout << typeid(f.Baz()).name()
也是可以的。如果你能获取到返回值的类型,类外的代码可以“看到”由Baz()
返回的类型,只是不能给它命名。 - Steve Jessopprivate
的存在是为了方便描述 API,以便编译器可以帮助执行。它并不意味着防止用户访问Foo
中的类型Bar
,因此它不会以任何方式阻碍Foo
通过返回Bar
实例来提供该访问权限。 - Steve Jessop#include <iostream>
。;-) - L. F.decltype
)。 - Baruch