首頁 >後端開發 >C++ >為什麼編譯器不替換轉換運算子中的型別?

為什麼編譯器不替換轉換運算子中的型別?

Susan Sarandon
Susan Sarandon原創
2024-11-15 20:32:02561瀏覽

Why Doesn't the Compiler Substitute Type in Conversion Operators?

理解C 語言中的轉換運算子

考慮以下程式碼片段:

template <class Type>
class smartref {
public:
    smartref() : data(new Type) { }
    operator Type&() { return *data; }
private:
    Type* data;
};

class person {
public:
    void think() { std::cout << "I am thinking"; }
};

int main() {
    smartref<person> p;
    p.think(); // Why doesn't the compiler try substituting Type?
}

在C 中,轉換運算符起作用在類型轉換中起著至關重要的作用。那麼,它們是如何運作的呢?

1.參數傳遞期間的轉換:

在參數傳遞期間考慮轉換運算符,遵循複製初始化規則。它們將來源類型轉換為任何相容類型,無論轉換是否為引用。

2.轉換為引用:

如果轉換後的型別是左值,則在條件運算子中允許轉換為引用。此外,直接綁定引用還可能涉及引用的轉換。

3.轉換為函數指標:

在進行函數呼叫時使用使用者定義的函數指標或參考轉換。

4.轉換為非類別型別:

隱式轉換,例如布林值轉換,可以使用使用者定義的轉換函數。

5.轉換函式範本:

範本可用來建立將型別轉換為任何指標型別(成員指標除外)的轉換函式。

編譯器為什麼不這樣做替換 Type?

在給定的範例中,編譯器不會取代 Type,因為 smartref 中的轉換運算子傳回指向內部資料成員的指標。當嘗試呼叫 think() 時,編譯器推斷 p 是指向 person 物件的指針,而不是對 person 物件的參考。因此,它不會進行任何顯式類型替換。

以上是為什麼編譯器不替換轉換運算子中的型別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn