这篇写个平时易被忽略的小知识点,一元 + 操作符的使用技巧。
一般二元 + 操作符用得较多,只有一个操作数时,没人会多此一举地把 1 写成 +1。
不过若是操作数为整数或无作用域枚举类型,一元 + 操作符会执行 integral promotion,此时会发生隐式转换。例如:
// unscoped enumerationenum enum : unsigned int { enum_val_a, enum_val_b, enum_val_c};int main() { bool b = true; +b; // int +enum_val_b; // unsigned int char c = 'c'; +c; // int unsigned short s = 10; +s; // int int array[10]; +array; // int*}
若是你使用的 c++ 标准不支持 std::to_underlying,你可能得使用以下语句来达到同样目的:
static_cast(enum_val_b);
这种写法太过繁琐,而以一元 + 操作符则可以非常简单地完成这种转换,当然前提须是 underlying 类型固定。
对于一些奇怪的类型,比如 std::uint8_t,它的类型是什么呢?顾名思义应该是 8-bit 的 unsigned integer,然而实际上它是 unsigned char 的 typedef。那么在输出的时候就会遇到一些问题:
std::uint8_t u = 0x45;std::cout << u; // e
最终输出将是 e,并不是一个无符号整数,你需要使用强制转换才能得到想要的输出。而借助一元 + 操作符,则可以非常简单地达到预期。
std::uint8_t u = 0x45;std::cout < std::integral;};struct s { int num;};// falsestatic_assert(hasvalue);
没能达到预期是因为 t::num 是个 value,而非 type。一种做法是采用 std::is_integral,
template concept hasvalue = requires(t t) { std::is_integral_v;};// truestatic_assert(hasvalue);
这种做法就将 t::num 变成了 type,同理也可以这样做:
template concept hasvalue = requires(t t) { decltype(t::num){};};
约束必须是表达式,是以无法只写类型。更简单的话可以这样写:
template concept hasvalue = requires(t t) { t::num++;};
因为自增运算符也可以构成表达式,那么最简单的做法就是采用一元 + 操作符。
template concept hasvalue = requires(t t) { +t::num;};
那么有没有办法可以禁止 integral promotion 呢?concepts 便有此妙用。看下面这个例子:
uint8_t bad_foo(uint8_t a, uint8_t b) { return a + b; // implicit conversion}std::same_as autogood_foo(uint8_t a, uint8_t b) { return a + b; // compile error!}
对于 bad_foo(),return a + b 在不经意间发生了 integral promotion,它其实相当于return uint8_t((int)a + (int)b)。
这种隐式转换的结果可能并不如人所愿,concepts 相当于给返回值声明了 explict,从而避免错误。当你明确不需要返回值隐式转换的时候,可以借助这种方式。
活用这些小技巧,不仅可以简化代码,还能增加程序安全性。
英特尔打造智能制造工厂 国民技术推进数字人民币创新
基于STM32和CAN总线的印染机同步控制系统设计
Lidl超市与一家专门从事3D可视化与AR的技术公司签订了合作协议
强化LED芯片业务布局,国星光电对半导体增资
微软推免费MSN视频播放器与iPlayer竞争
“+”操作符的使用技巧
对虾养殖水体的稳定该如何监控如何维护
关于RFID技术在制药业产线中的应用方案
基于51单片机的酒精消毒系统设计
2023年人社部“数智化关键技术的发展与应用”高级研修班暨大数据融合分析与应用山西省重点实验室2023年第
区块链在垃圾治理行业中的应用
ARM三年时间平均每年出货超过220亿ARM芯片 并在26年中出货首次超过1000亿
美国新颖医疗器械—新型“集尿袋”
SWARM虫型机器人能进入发动机内部进行检修
UDS之19服务中04子服务:读取快照数据
Gartner:2018年十大战略科技发展趋势详解
Makefile简介和使用方法
FPGA设计的迭代闭环思维和增量编译的用法
全球芯片短缺何时恢复
你觉得你的物联网安全吗