为什么我可以在私人类型上使用汽车?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

下面的代码编译和运行(vc 2012&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在私有类型上,而我不能使用它的名称?

提问于
用户回答回答于

规则auto在大多数情况下,与模板类型演绎相同。发布的示例的工作原理与可以将私有类型的对象传递给模板函数的原因相同:

template <typename T>
void fun(T t) {}

int main() {
    Foo f;
    fun(f.Baz());         // ok
}

为什么我们可以将私有类型的对象传递给模板函数呢?因为只有类型的名称是不可访问的。类型本身仍然是可用的,这就是为什么可以将其返回到客户端代码的原因。

用户回答回答于

与标准中的示例相比:

class A {
  class B { };
public:
  typedef B BB;
};

void f() {
  A::BB x; // OK, typedef name A::BB is public
  A::B y; // access error, A::B is private
}

扫码关注云+社区