重载的“ operator ++”返回非常量,并且clang-tidy抱怨

时间:2018-10-18 09:28:55

标签: c++ operator-overloading postfix-operator clang-tidy

我刚从clang-tidy收到以下警告:

overloaded "operator++" returns a non-constant object 
 instead of a constant object type

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

不幸的是,他们提供的链接不起作用,https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=88046682也没有简单的方法来准确地找到此规则(似乎DCL规则从50开始)。

但是不管我在标准中的什么位置(例如ex 16.5.7递增和递减[over.inc]),我都找不到引用后缀operator ++应该返回const的引用:

struct X {
    X operator++(int); // postfix a++
};

问题:只是整洁的过度保护,错误,还是为什么我要声明后缀的返回类型为const?

1 个答案:

答案 0 :(得分:10)

试图阻止您编写无法完成任何事情的代码是很容易的事情:

(x++)++; // Did we just increment a temporary?

这类重载可能有用,但通常不适用于后缀++。您有两种选择:

  1. 按照clang-tidy所说的去做,但是也许会失去移动语义学的好处。
  2. 左值对超载进行限定,以模仿小整数。

    X operator++(int) &; // Can't apply to rvalues anymore.
    

选项2更好;防止这些愚蠢的错误,并在适用的情况下保留移动语义。