перегруженный «оператор ++» возвращает неконстантный тип, и clang-tidy жалуется - PullRequest
0 голосов
/ 18 октября 2018

Я только что получил следующее предупреждение от 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]),Я не нахожу никаких ссылок на то, что postfix operator ++ должен возвращать const:

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

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

1 Ответ

0 голосов
/ 18 октября 2018

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

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

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

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

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

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

...