首頁 > 後端開發 > C++ > 為什麼禁止直接存取時`auto`可以存取私有C類型?

為什麼禁止直接存取時`auto`可以存取私有C類型?

Mary-Kate Olsen
發布: 2024-12-16 06:31:11
原創
810 人瀏覽過

Why Can `auto` Access Private C   Types When Direct Access Is Forbidden?

汽車和私有類型:揭開可訪問性之謎

在 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板