微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Clang-Tidy 模棱两可:operator++(int) 应该返回什么?

如何解决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。事实上,在我决定提出自己的问题之前,我遇到了这篇文章,因为它没有为我回答。问题是在链接的帖子中,建议了两个选项:

  1. 按照 clang-tidy 所说的去做,但可能会失去移动语义的好处。
  2. 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 举报,一经查实,本站将立刻删除。