我在看 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 获取 MyStruct
的 typeid
时我在程序集输出中看到显示为 f()::MyStruct
的类型,所以有一个范围,但不知何故我可以访问该范围之外的 MyStruct
。这是某种 ADL 吗?
最佳答案
不,不涉及 ADL。由于您的翻译单元包含结构的定义,因此访问其成员没有问题。
重要的一点是 types 并不真正存在于作用域中:names 确实存在。请注意,在声明 a
时,您无法使用标识符 MyStruct
代替 auto
。这个名字应该是不可访问的。但是,只要您可以在不使用无法访问的名称的情况下获取类型,一切都很好。
原则上,这与使用 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);
}
关于c++ - 为什么我可以通过返回类型推导从函数外部访问函数内部定义的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42362899/