在 C 领域,汽车的多功能性经常激发好奇心,有时甚至令人困惑。当将 auto 与私有类型一起使用时,会出现一个令人困惑的现象。
考虑以下代码片段,令人惊讶的是,它编译时没有错误:
class Foo { struct Bar { int i; }; public: Bar Baz() { return Bar(); } }; int main() { Foo f; auto b = f.Baz(); // ok std::cout << b.i; }
这种非常规行为提出了一个问题:为什么我们可以访问通过 auto 实现私有类型,而禁止直接访问?
要解开这个谜团,我们必须深入研究 auto 的机制。它的类型推导规则很大程度上反映了 C 模板的类型推导规则。这一观察结果适用于上述代码示例。正如我们可以将私有类型的对象作为参数传递给模板函数一样:
template <typename T> void fun(T t) {} int main() { Foo f; fun(f.Baz()); // ok }
我们也可以使用 auto 来推断它们的类型。这是因为即使类型名称本身仍然无法访问,类型信息仍然可用。这允许将私有类型返回给客户端代码,从而允许通过自动进行原本禁止的访问。
以上是为什么禁止直接访问时`auto`可以访问私有C类型?的详细内容。更多信息请关注PHP中文网其他相关文章!