C++ 超载;操作员++&引用;返回一个非常量,并发出叮当声

C++ 超载;操作员++&引用;返回一个非常量,并发出叮当声,c++,operator-overloading,postfix-operator,clang-tidy,C++,Operator Overloading,Postfix Operator,Clang Tidy,我刚从叮叮当当收到以下警告: overloaded "operator++" returns a non-constant object instead of a constant object type 不幸的是,他们提供的链接不起作用,也没有简单的方法来准确地找到这个规则(似乎DCL规则从50开始) 但无论我在标准中查找到什么地方(对于ex 16.5.7 Increment and Decreation[over.inc]),我都没有发现postfixoperator++应该返回常量

我刚从叮叮当当收到以下警告:

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

不幸的是,他们提供的链接不起作用,也没有简单的方法来准确地找到这个规则(似乎DCL规则从50开始)

但无论我在标准中查找到什么地方(对于ex 16.5.7 Increment and Decreation[over.inc]),我都没有发现postfix
operator++
应该返回常量的引用:

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

问题:clang tidy是否过度保护、错误,或者我为什么要将后缀的返回类型声明为const?

clang tidy试图阻止您编写一事无成的代码:

(x++)++; // Did we just increment a temporary?
这种形式的重载可能有用,但通常不适用于后缀
++
。您有两个选择:

  • 照clang tidy说的去做,但可能会失去移动语义的本菲茨

  • 左值ref限定重载,以模拟小整数

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

  • 方案2更优;防止这些愚蠢的错误,并保留移动语义(如果适用)。

    奇怪的是,卡内基梅隆大学似乎已经改变了他们对该指南的想法,因为它已经不存在了。@无用-在C++03中,这是防止此错误的唯一方法(而且没有移动语义可担心)。我猜他们可能是按照当代C++更新的吧?遗憾的是,他们选择断开所有传入的链接,而不是留下一张这样的便条。@Password-应该断开。假设
    X++
    的行为符合预期,并返回旧值的副本,它将编译,但已被破坏
    foo
    没有看到更新的值。@StoryTeller UnslanderMonica如果您在回答中提到这一点,我想这会很有帮助。注意:我过去为此记录了一个错误,目前还没有反应: