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