Перегруженный "оператор ++" возвращает неконстантный тип, и 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 ++
, У вас есть два варианта:
- Делайте, как говорит Clang-Tidy, но тогда, возможно, потеряете преимущества семантики перемещения.
lvalue повторно квалифицирует перегрузку, чтобы имитировать маленькие целые.
X operator++(int) &; // Can't apply to rvalues anymore.
Варианты 2 лучше; предотвращает эти глупые ошибки и сохраняет семантику перемещения, если применимо.