【发布时间】:2015-05-14 18:52:22
【问题描述】:
我正在阅读this Stack Overflow question,并在该问题的代码中添加了一个构造函数,如下所示,
class Foo {
struct Bar {
int i;
Bar(int a = 5) :i(a) {};
};
public:
Bar Baz() { return Bar(); }
};
int main() {
Foo f;
// Foo::Bar b = f.Baz(); // error
auto b = f.Baz(); // ok
std::cout <<"b.i="<< b.i<<endl;
return 0;
}
代码输出b.i=5。在那个问题中,它得出结论,私有的名称不可访问,但类型是可访问的。那么类型和名称之间的区别通常是什么?
假设我有两个特定的场景。
-
以下两个声明有什么区别?为什么我可以从
auto b = f.Baz();得到输出b.i=5?Foo::Bar b = f.Baz(); auto b = f.Baz(); -
如果我在
Foo的公共部分添加typedef Bar B;,下面有什么区别?Foo::Bar b = f.Baz(); Foo::B b = f.Baz();
如果方案 1 和 2 之间有区别?
【问题讨论】:
-
我会说不存在私有 types 之类的东西。只有私有的成员,这仅仅意味着他们的名字是不可访问的。类型本身不受访问控制。
-
dyp 是对的,名称和类型是两个不同的东西,在编译阶段它们的处理方式不同