为什么我可以通过返回类型推导从函数外部访问函数内定义的结构?

blu*_*eck 12 c++ c++14

我正在观看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标准中是否有允许这样的段落?

当试图获得typeidMyStruct与铛编译探险我在装配输出类型显示为看到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)