Auto 和 Private 类型:为什么矛盾?
在提供的代码中,使用 auto 声明一个接收返回值的变量 b f.Baz() 成功,而使用显式类型 Foo::Bar 会导致错误。这种不一致让很多开发者感到困惑。
自动推导的规则一般遵循模板类型推导的规则。这意味着,就像您可以将私有类型的对象传递给模板函数一样,您也可以使用 auto 声明这些类型的变量。
这样做的原因在于,虽然私有类型的名称类型无法访问,但类型本身仍然可用。这在将私有类型的对象返回给客户端代码的能力中显而易见。即使类型的名称没有公开,编译器也可以推断出返回值的类型。
在 auto 的情况下,编译器根据其后面的表达式执行类型推导。由于 f.Baz() 返回 Foo::Bar 类型的对象,因此编译器将 Foo::Bar 类型分配给 auto。但是,由于名称 Foo::Bar 是私有的,编译器无法直接创建该类型的变量。相反,它使用与 Foo::Bar 具有相同成员和属性的匿名类型。这允许 b 访问 i 成员,即使显式类型名称不可访问。
以上是自动类型与私有类型:为什么变量声明存在差异?的详细内容。更多信息请关注PHP中文网其他相关文章!