Перегруженный "оператор ++" возвращает неконстантный тип, и 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).

Но независимо от того, где я смотрю в стандарте (например, 16.5.7 Увеличение и уменьшение [over.inc]), я не нахожу ссылку на этот постфикс operator ++ должен вернуть const:

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

Вопрос: это просто чрезмерная защита, ошибочность или почему я хочу объявить тип возвращаемого значения постфикса константным?

1 ответ

Решение

Это неуклюжая попытка помешать вам писать код, который ничего не делает:

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

Такие формы перегрузки могут быть полезны, но обычно не для postfix ++, У вас есть два варианта:

  1. Делайте, как говорит Clang-Tidy, но тогда, возможно, потеряете преимущества семантики перемещения.
  2. lvalue повторно квалифицирует перегрузку, чтобы имитировать маленькие целые.

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

Варианты 2 лучше; предотвращает эти глупые ошибки и сохраняет семантику перемещения, если применимо.

Другие вопросы по тегам