[英]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.