首页 > 后端开发 > C++ > 为什么禁止直接访问时`auto`可以访问私有C类型?

为什么禁止直接访问时`auto`可以访问私有C类型?

Mary-Kate Olsen
发布: 2024-12-16 06:31:11
原创
810 人浏览过

Why Can `auto` Access Private C   Types When Direct Access Is Forbidden?

汽车和私有类型:揭开可访问性之谜

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板