在類別中使用私有類型時,您可能會遇到一種奇怪的情況:在嘗試明確聲明一個使用類型名稱的變數會導致錯誤,使用「auto」來推斷類型似乎可行
class Foo { struct Bar { int i; }; public: Bar Baz() { return Bar(); } };
在給定的程式碼中,Foo包含一個私有嵌套類型 Bar。執行以下行會引發錯誤:
Foo::Bar b = f.Baz(); // error
意外地,使用「auto」解決了問題:
auto b = f.Baz(); // ok
為什麼允許這樣做?
「自動」類型推導和模板類型推論都具有相似的底層機制。在這種情況下,它類似於「模板」函數如何與私有類型一起使用:
template <typename T> void fun(T t) {} int main() { Foo f; fun(f.Baz()); // ok }
揭開可訪問性
將私有類型的物件傳遞給模板函數或使用“auto”來推斷其類型源於這樣一個事實:類型本身仍然可訪問,即使其名稱是隱藏的。編譯器透過類型推導,解開物件的結構,從而實現其利用。
因此,雖然私有類型的名稱無法訪問,但其類型資訊仍然可用,允許透過「auto」等機制進行操作' 或模板推導。
以上是為什麼'auto”可以與私有類型一起使用而明確聲明失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!