在 C 領域,汽車的多功能性經常激發好奇心,有時甚至令人困惑。當 auto 與私有型別一起使用時,會出現一個令人困惑的現象。
考慮以下程式碼片段,令人驚訝的是,它編譯時沒有錯誤:
class Foo { struct Bar { int i; }; public: Bar Baz() { return Bar(); } }; int main() { Foo f; auto b = f.Baz(); // ok std::cout << b.i; }
這種非常規行為提出了一個問題:為什麼我們可以存取透過auto 實現私有類型,而禁止直接存取?
要解開這個謎團,我們必須深入研究 auto 的機制。它的類型推導規則很大程度上反映了 C 模板的類型推導規則。這一觀察結果適用於上述程式碼範例。就像我們可以將私有類型的物件作為參數傳遞給模板函數:
template <typename T> void fun(T t) {} int main() { Foo f; fun(f.Baz()); // ok }
我們也可以使用 auto 來推斷它們的類型。這是因為即使類型名稱本身仍然無法訪問,類型資訊仍然可用。這允許將私有類型傳回給客戶端程式碼,從而允許透過自動進行原本禁止的存取。
以上是為什麼禁止直接存取時`auto`可以存取私有C類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!