我正在看one of Jason Turner's videos,我看到你可以在函数范围内定义一个类型,并通过函数返回类型推导使其在该范围之外可用。
auto f()
{
struct MyStruct
{
int n;
};
return MyStruct{};
}
int main()
{
auto a = f().n;
return a;
}
为什么允许这样做? C ++ 14标准中是否有允许这样的段落?
尝试在compile explorer中使用clang获取typeid
MyStruct
时,我在程序集输出中看到显示为f()::MyStruct
的类型,因此有一个范围,但是不知何故,我可以访问该范围之外的MyStruct
。这是ADL的某种东西吗?
答案 0 :(得分:13)
不,没有涉及ADL。由于您的翻译单元包含结构的定义,因此访问其成员没有问题。
重要的一点是 types 并不存在于范围中: names 。请注意,在声明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);
}