所以,我一直在致力于一项作业的
Vector
实现,并在实现迭代器时注意到一些奇怪的 Clang-Tidy 建议。
根据要求的规范,迭代器必须具有
iterator& operator++()
和 iterator operator++(int)
重载。现在,当我尝试定义 iterator operator++(int)
(它本质上是复制迭代器、递增指针,然后返回该副本)时,Clang-Tidy 抱怨道:
重载的“operator++”返回一个非常量对象而不是常量对象类型
(显然)这应该通过将返回类型更改为
const iterator
来解决,这是一种非常罕见的技术。不过,相应地更改签名会让 Clang-Tidy 再次抱怨:
返回类型“const Vector::iterator”(又名“const Vector::Iterator”)在顶层具有“const”限定,这可能会降低代码的可读性,而不会提高 const 正确性
CLion 2020.3.2 中的默认修复操作实际上删除了
const
,这会带回原始的 Clang-Tidy 警告。
我想知道什么是“正确”的实施方式
operator++(int)
。在这种情况下我应该忽略 Clang-Tidy 吗?如果是,我应该选择哪个签名?
谢谢!
编辑1
以下帖子没有回答我的问题:其他 StackOverflow 问题。事实上,在我决定问自己的问题之前我就看到了这篇文章,因为它没有为我解答。问题是在链接的帖子中,建议了两个选项:
- 按照 clang-tidy 所说的去做,但可能会失去移动语义的好处。
- 左值引用限定重载,以模仿小整数。
(1) 的意思正是我所做的,即将
const
放在 iterator
返回类型前面。正如我在帖子中所述,这会触发第二个 Clang-Tidy 警告。
(2) 不会删除 Clang-Tidy 警告。另外我不确定我是否可以在作业的限制下使用它。
此外,这是一个最小的可重现示例:
class Iterator {
ptr_type ptr; // whatever your pointer type is
// some code
public:
explicit Iterator(ptr_type _ptr) : ptr{ _ptr } {}
// Option #1
Iterator operator++(int) { // Clang-Tidy warning #1 will be triggered here
Iterator copy{ ptr };
++ptr;
return copy;
}
// Option #2
const Iterator operator++(int) { // Clang-Tidy warning #2 will be triggered here
Iterator copy{ ptr };
++ptr;
return copy;
}
// more code
};
https://clang.llvm.org/extra/clang-tidy/checks/cert/dcl21-cpp.html
根据此页面,第一个警告已被弃用,并将在 clang-tidy 版本 19 中删除。我建议在配置文件中禁用该警告或忽略它。