簡體   English   中英

為什么我可以通過返回類型推導從函數外部訪問函數內定義的結構?

[英]Why can I access a struct defined inside a function from outside the function through return type deduction?

我正在觀看Jason Turner的一個視頻 ,我看到你可以在一個函數范圍內定義一個類型,並通過函數返回類型推導使它在該范圍之外可用。

auto f()
{
    struct MyStruct
    {
        int n;
    };
    return MyStruct{};
}

int main()
{
   auto a = f().n;
   return a;
}

為什么允許這樣做? C ++ 14標准中是否有允許這樣的段落?

當我在編譯資源管理器MyStruct使用clang獲取MyStructtypeid ,我在程序集輸出中看到顯示為f()::MyStruct的類型,因此有一個范圍,但不知怎的,我可以訪問該范圍之外的MyStruct 這是某種ADL的事嗎?

不,沒有涉及ADL。 由於您的翻譯單元包含結構的定義,因此訪問其成員時沒有問題。

重要的一點是類型在范圍中並不存在: 名稱確實存在。 請注意,在聲明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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM