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

时间:2017-02-21 09:05:31

标签: c++ c++14

我正在看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的某种东西吗?

1 个答案:

答案 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);
}