![](/img/trans.png)
[英]why can't i define a function of return type 'pointer to struct' outside of class?
[英]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獲取MyStruct
的typeid
,我在程序集輸出中看到顯示為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.