我惊讶地发现以下代码可以编译并运行(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
不能使用它的名称(如预期的那样)而使用私有类型?
而且,如果您认为这很奇怪(您可能正在做,在询问时就看到了),您不是唯一一个人;)但是,这种策略对于诸如Safe-Bool成语这样的事情很有用。
—
Matthieu M.
我认为要记住的是,
—
史蒂夫·杰索普
private
以一种编译器可以帮助执行的方式来描述API十分方便。并不是要阻止Bar
的用户访问此类型Foo
,因此它不会Foo
以任何方式通过返回的实例来提供该访问权限Bar
。
“这段代码可以正确编译吗?” 不,您需要
—
LF
#include <iostream>
。;-)
f.Baz().i
原样观察也可以std::cout << typeid(f.Baz()).name()
。Baz()
如果可以理解,类外的代码可以“查看”返回的类型,只是无法命名。