Clang-Tidy 不明确:operator++(int) 应该返回什么?

问题描述 投票:0回答:1

所以,我一直在致力于一项作业的

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

  1. 按照 clang-tidy 所说的去做,但可能会失去移动语义的好处。
  2. 左值引用限定重载,以模仿小整数。

(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
};
c++ operator-overloading clang-tidy
1个回答
0
投票

https://clang.llvm.org/extra/clang-tidy/checks/cert/dcl21-cpp.html

根据此页面,第一个警告已被弃用,并将在 clang-tidy 版本 19 中删除。我建议在配置文件中禁用该警告或忽略它。

© www.soinside.com 2019 - 2024. All rights reserved.