我正在观看Jason Turner的一个视频,我看到你可以在函数范围内定义一个类型,并通过函数返回类型推导使其在该范围之外可用.
auto f()
{
struct MyStruct
{
int n;
};
return MyStruct{};
}
int main()
{
auto a = f().n;
return a;
}
Run Code Online (Sandbox Code Playgroud)
为什么允许这样做?C++ 14标准中是否有允许这样的段落?
当试图获得typeid的MyStruct与铛编译探险我在装配输出类型显示为看到f()::MyStruct,所以有一个范围,但不知何故,我可以访问MyStruct该范围之外.这是某种ADL的事吗?
Rei*_*ica 13
不,没有涉及ADL.由于您的翻译单元包含结构的定义,因此访问其成员时没有问题.
重要的一点是类型在范围中并不存在:名称确实存在.请注意,您无法使用标识符MyStruct而不是auto在声明时使用标识符a.这个名字应该是不可访问的.但是,只要您可以在不使用无法访问的名称的情况下获得该类型,一切都很好.
原则上,这与使用private成员类型几乎没有区别:
class X
{
struct Hidden
{
int i;
};
public:
Hidden get() const { return {42}; }
};
int main()
{
X x;
auto h = x.get();
assert(h.i == 42);
}
Run Code Online (Sandbox Code Playgroud)