簡體   English   中英

聯合體上的類型轉換重載而不重載+ =

[英]Typecast Overloading On Union Without Overloading +=

union word{
    uint16_t value;

    struct{
        uint8_t low;
        uint8_t high;
    };


    inline  word(uint16_t value) noexcept
        :value(value)
    {}


    inline word &operator=(uint16_t rhs) noexcept{
        value = rhs;
        return *this;
    }

    inline operator uint16_t() const noexcept{
        return value;
    }
}

我正在嘗試定義一個小端2字節類型,在其中可以輕松訪問低字節和高字節。 另外,我希望“字”類型在調用任何算術運算符時完全像uint16_t一樣起作用。 因此,我已經為uint16_t重載了typecast運算符。

但是我遇到了一個小問題:

word w1 = 5;
w1 = w1 + w1;  //this works fine due to implicit conversion
w1 += w1; //fails to compile.  lhs will not implicitly convert

我了解為什么它無法編譯。 我想避免重載所有算術運算符,例如+ =,-=,&=,| =等。是否有避免避免必須定義所有運算符的重載? 我可能會需要大多數。

非常感謝你!

問題在於此行:

inline operator uint16_t() const noexcept{
   return value;
}

當你做

w1 += w1;

左手w1隱式轉換為uint16_t 但是,實際上您正在返回w1.value副本 ,該副本作為轉換的結果是一個臨時對象。 並且不允許您分配給臨時對象 而且,如果您能做到神奇,則更改將不會反映到w1.value ,這是您不想要的。

要解決您的問題,請返回value引用 ,並使轉換函數不是const ,因為您絕對希望value可以修改。

inline operator uint16_t&() noexcept{
   return value;
}

這是一個實時示例,表明該解決方案有效。


但是,我建議您閱讀以下問題: 運算符重載

與依賴隱式轉換相比,顯式重載類的運算符將更加安全和可預測,這有時會產生奇怪的結果和編譯錯誤。

暫無
暫無

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

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