在类中使用私有类型时,您可能会遇到一种奇怪的情况:在尝试显式声明一个使用类型名称的变量会导致错误,使用“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中文网其他相关文章!