VS2019下C++ lnt-accidental-copy告警 有意复制迭代器如何处理
解决方案
1. 单行告警抑制(最优方案)
虽然官方早期公告说明该版本仅支持全局开关,但实际Visual Studio 2019 16.11.x的子版本已经支持单行指定规则抑制,你只需在触发告警的行末尾添加对应注释即可,不需要修改任何代码逻辑:
for (auto it = partIt; it != end(vectorOfStuff); ++it) // NOLINT(lnt-accidental-copy)
如果上述注释不生效,可以替换为微软原生的抑制格式:// lint-ignore lnt-accidental-copy。这种方式完全不改动原有代码,也不需要额外注释说明改动原因,是最简洁的处理方式。
2. 无注释代码改动方案
如果你的版本确实不支持单行抑制,可使用显式拷贝构造的写法触发linter的主动拷贝识别,不会触发告警:
for (auto it(partIt); it != end(vectorOfStuff); ++it)
这种写法不需要额外引入头文件,也不需要写完整的迭代器类型,可读性和原有写法几乎一致。
补充说明
你提到的两种方案存在明显缺陷:
auto it = next(partIt, 0)依赖<iterator>头文件,且额外的函数调用会降低代码可读性- 显式声明
vector<SomeClass>::iterator强耦合容器类型,后续如果调整容器类型需要同步修改迭代器声明,维护成本更高
内容的提问来源于stack exchange,提问作者Timothy Byrd
相关产品推荐
相关产品推荐

