clang-tidy校验:如何正确实现后置operator++满足两类检查规则
双告警冲突根因
两个检查规则的适用C++版本不同,才会出现互斥触发的矛盾:
cert-dcl21-cpp基于C++03时期的安全规范设计:后置自增返回非const值时,会允许(iter++)++这类不符合语义的操作——后置自增本应返回修改前的副本,二次自增只会修改临时对象,完全不符合开发者预期。readability-const-return-type是适配C17及以上版本的规则:C17开始非类类型纯右值的顶层const会被自动忽略,规则默认判定所有顶层const返回值都属于无用修饰,既不提升安全性还降低可读性。
解决方案
可根据项目场景二选一:
方案1:修改clang-tidy配置(推荐)
不需要修改业务代码,直接在项目的.clang-tidy配置中为可读性检查添加后置运算符例外即可:
CheckOptions: # 跳过后置自增/自减运算符的顶层const检查 - key: readability-const-return-type.IgnoreOperatorPostIncrementDecrement value: true
配置完成后保留Iter const operator++(int);的写法,就能同时满足两个检查规则的要求。
方案2:代码层面适配(无需修改全局检查配置)
如果没有权限调整全局检查规则,可根据迭代器类型选择对应写法:
- 若迭代器为输入迭代器:输入迭代器的特性是自增后原有副本直接失效,不存在
(iter++)++的合法使用场景,直接加行内抑制即可:Iter& operator++(); // NOLINTNEXTLINE(cert-dcl21-cpp) 输入迭代器后置自增返回副本无非法使用风险 Iter operator++(int); - 若迭代器为前向/双向/随机访问迭代器且项目使用C17以下标准:
readability-const-return-type规则本身不适配低版本C,直接全局关闭该规则即可,保留Iter const operator++(int);写法符合C++03/11/14的安全规范。
内容的提问来源于stack exchange,提问作者Mischael Schill
相关产品推荐
相关产品推荐

