簡體   English   中英

C ++中的隱式轉換

[英]Implicit conversion in C++

在C ++中,我試圖使用條件運算符進行隱式轉換。 考慮這個例子:

class MyFloat
{ 
    public:                                                                    
        MyFloat(float val){m_val = val;}
        operator float(){return m_val;}
    protected:
        float m_val;
};

int main(int argc, char **argv)
{
    MyFloat a = 0.5f;
    MyFloat b = 1.0f;                            
    float x = true ? a-0.5f : b;
    return 0;
}

它會導致編譯器錯誤:

error: operands to ?: have different types ‘MyFloat’ and ‘float’

我希望條件運算符隱式地將b轉換為a-0.5 ,float的類型。 但這不會發生。 我如何實現這種隱式演員?

理想情況下,我想避免靜態float MyFloat::getValue()或訪問器方法,如float MyFloat::getValue()

問題是有兩次轉換。 編譯器可以將a-0.5轉換為MyFloat ,也可以將b轉換為float 只要您同時進行了兩次轉換,並且兩者都沒有explicit標記,您就會始終獲得這種模糊性。

只為您完成了一些轉換。 來自http://msdn.microsoft.com/en-us/library/e4213hs1(v=vs.71).aspx

第一個操作數必須是整數或指針類型。 以下規則適用於第二個和第三個表達式:

  • 如果兩個表達式的類型相同,則結果為該類型。
  • 如果兩個表達式都是算術類型或枚舉類型,則執行通常的算術轉換(在算術轉換中涵蓋)以將它們轉換為通用類型。
  • 如果兩個表達式都是指針類型或者如果一個是指針類型而另一個是一個計算結果為0的常量表達式,則執行指針轉換以將它們轉換為公共類型。
  • 如果兩個表達式都是引用類型,則執行引用轉換以將它們轉換為公共類型。
  • 如果兩個表達式都是void類型,則常見類型為void類型。
  • 如果兩個表達式都是給定的類類型,則通用類型是該類類型。

如果我沒記錯的話,三元運算符不會進行任何隱式轉換。 你需要寫

static_cast<MyFloat>(a-0.5) 

要么

static_cast<float>(b). 

當我回到家中獲取更多細節時,我將深入研究C ++標准文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM