gpt4 book ai didi

c++ - 在没有重载的情况下在 Union 上进行类型转换重载 +=

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:26:37 25 4
gpt4 key购买 nike

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;
}
}

我正在尝试定义一个 little endian 2 字节类型,以便于访问低字节和高字节。此外,我希望“word”类型在调用任何算术运算符时完全像 uint16_t 一样。因此,我为 uint16_t 重载了类型转换运算符。

但是我遇到了一个小问题:

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拷贝,作为转换的结果,它是一个临时对象。并且您不能分配给临时对象。如果您可以神奇地做到这一点,这些更改将不会反射(reflect)到 w1.value,这是您不想要的。

要解决您的问题,请返回 valuereference,并使转换函数不是 const,因为您绝对希望 value 是可修改的。

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

Here is a live example显示该解决方案有效。


但是,我建议你阅读这个问题:Operator overloading

显式重载类的运算符比依赖隐式转换更安全和可预测,隐式转换有时会产生奇怪的结果和编译错误。

关于c++ - 在没有重载的情况下在 Union 上进行类型转换重载 +=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18395744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com