首页 > 后端开发 > C++ > 为什么'auto”可以与私有类型一起使用而显式声明失败?

为什么'auto”可以与私有类型一起使用而显式声明失败?

Mary-Kate Olsen
发布: 2024-12-16 00:57:09
原创
654 人浏览过

Why Does 'auto' Work with Private Types While Explicit Declaration Fails?

在私有类型上使用“auto”:可访问性揭开

在类中使用私有类型时,您可能会遇到一种奇怪的情况:在尝试显式声明一个使用类型名称的变量会导致错误,使用“auto”来推断类型似乎可行

class Foo {
    struct Bar { int i; };
public:
    Bar Baz() { return Bar(); }
};
登录后复制

在给定的代码中,Foo 包含一个私有嵌套类型 Bar。执行以下行会引发错误:

Foo::Bar b = f.Baz();  // error
登录后复制

意外地,使用“auto”解决了问题:

auto b = f.Baz();         // ok
登录后复制

为什么允许这样做?

“自动”类型推导和模板类型推断都具有相似的底层机制。在这种情况下,它类似于“模板”函数如何与私有类型一起使用:

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

int main() {
    Foo f;
    fun(f.Baz());         // ok
}
登录后复制

揭开可访问性

将私有类型的对象传递给模板函数或使用“auto”来推断其类型源于这样一个事实:类型本身仍然可访问,即使其名称是隐藏的。编译器通过类型推导,解开对象的结构,从而实现其利用。

因此,虽然私有类型的名称无法访问,但其类型信息仍然可用,允许通过“auto”等机制进行操作' 或模板推导。

以上是为什么'auto”可以与私有类型一起使用而显式声明失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

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