根据std::byte
关于优先选择的文档,operator|
for std::byte
的实现应该等同于
constexpr std::byte operator|(std::byte l, std::byte r) noexcept
{
return std::byte{ static_cast<unsigned>(l) | static_cast<unsigned>(r) };
}
(操作符&
、^
、~
应该类似地实现)
如果l
和r
的底层类型是char unsigned
,为什么std::byte
需要转换为int unsigned
?
注意:我知道char unsigned{} | char unsigned{}
会导致int
,因为每个操作数在按位或应用之前被提升到int
;而unsigned{} | unsigned{}
返回unsigned
,而没有进行升级。不过,我不明白在这情况下,究竟是甚麽问题会导致这样的推广呢?
发布于 2022-06-28 07:00:17
对于小于int
的整数类型,它们在应用运算符之前被提升为int
。这意味着如果你
return std::byte{ l | r };
那么您将有一个有符号的整数。通过使用
return std::byte{ static_cast<unsigned>(l) | static_cast<unsigned>(r) }
您显式地将操作数转换为无符号整数,这样就不会发生对int
的提升。
与无符号整数类型不同的是,在C++20作为有符号整数不需要使用两个补码表示之前,这可能会产生不同。
https://stackoverflow.com/questions/72788661
复制相似问题