我刚从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?
答案 0 :(得分:10)
试图阻止您编写无法完成任何事情的代码是很容易的事情:
(x++)++; // Did we just increment a temporary?
这类重载可能有用,但通常不适用于后缀++
。您有两种选择:
左值对超载进行限定,以模仿小整数。
X operator++(int) &; // Can't apply to rvalues anymore.
选项2更好;防止这些愚蠢的错误,并在适用的情况下保留移动语义。