如何解决Clang-Tidy 模棱两可:operator++(int) 应该返回什么?
因此,我一直在为一个赋值进行 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
以下帖子不能回答我的问题:Other StackOverflow Question。事实上,在我决定提出自己的问题之前,我遇到了这篇文章,因为它没有为我回答。问题是在链接的帖子中,建议了两个选项:
- 按照 clang-tidy 所说的去做,但可能会失去移动语义的好处。
- lvalue ref-qualify 重载,以模仿小整数。
(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
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。