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

标签 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 获取 MyStructtypeid 时我在程序集输出中看到显示为 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/

相关文章:

c++ - 标记为 bitset 和 uint64_t 的并集

c++ - 如何确定枚举中的成员数?

c++ - Poco C++ 与柯南依赖管理器的链接问题,我该如何解决?

c++ - 模板参数包中的 6 个点是什么?

c++ - 覆盖 operator[] 和调用方法

c++ - 如何在 for 循环中迭代 `std::stack` 个元素?

c++ - 均匀实数分布的范围限制是多少?

c++ - void_t 在 Visual Studio 2015 上失败

c++ - lambda : GCC bug and/or Clang bug? 中捕获变量的 decltype()

c++ - 将一组转发引用包装在一个元组中