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]),我都没有发现postfixoperator++
应该返回常量的引用:
struct X {
X operator++(int); // postfix a++
};
问题:clang tidy是否过度保护、错误,或者我为什么要将后缀的返回类型声明为const?clang tidy试图阻止您编写一事无成的代码:
(x++)++; // Did we just increment a temporary?
这种形式的重载可能有用,但通常不适用于后缀++
。您有两个选择:
X operator++(int) &; // Can't apply to rvalues anymore.
方案2更优;防止这些愚蠢的错误,并保留移动语义(如果适用)。奇怪的是,卡内基梅隆大学似乎已经改变了他们对该指南的想法,因为它已经不存在了。@无用-在C++03中,这是防止此错误的唯一方法(而且没有移动语义可担心)。我猜他们可能是按照当代C++更新的吧?遗憾的是,他们选择断开所有传入的链接,而不是留下一张这样的便条。@Password-应该断开。假设
X++
的行为符合预期,并返回旧值的副本,它将编译,但已被破坏foo
没有看到更新的值。@StoryTeller UnslanderMonica如果您在回答中提到这一点,我想这会很有帮助。注意:我过去为此记录了一个错误,目前还没有反应: