Auto 和 Private 類型:為什麼矛盾?
在提供的程式碼中,使用 auto 宣告一個接收回傳值的變數 b f.Baz() 成功,而使用明確型別 Foo::Bar 會導致錯誤。這種不一致讓很多開發者感到困惑。
自動推導的規則一般遵循範本類型推導的規則。這意味著,就像您可以將私有類型的物件傳遞給範本函數一樣,您也可以使用 auto 聲明這些類型的變數。
這樣做的原因在於,雖然私有類型的名稱類型無法訪問,但類型本身仍然可用。這在將私有類型的物件傳回給客戶端程式碼的能力中顯而易見。即使類型的名稱沒有公開,編譯器也可以推斷出傳回值的類型。
在 auto 的情況下,編譯器會根據其後面的表達式執行型別推導。由於 f.Baz() 傳回 Foo::Bar 類型的對象,因此編譯器將 Foo::Bar 類型指派給 auto。但是,由於名稱 Foo::Bar 是私有的,編譯器無法直接建立該類型的變數。相反,它使用與 Foo::Bar 具有相同成員和屬性的匿名類型。這允許 b 存取 i 成員,即使顯式類型名稱不可存取。
以上是自動類型與私有類型:為什麼變數宣告存在差異?的詳細內容。更多資訊請關注PHP中文網其他相關文章!