Нужен ли на операторах nodiscard? - PullRequest
1 голос
/ 01 августа 2020

Требуется ли атрибут [[nodiscard]] для операторов? Или можно с уверенностью предположить, что компилятор выдаст предупреждение, как для большинства подозрительно выброшенных вещей?

Например, перегруженный operator+, следует ли применять атрибут? А как насчет специальных операторов, таких как операторы преобразования функций или новые операторы? Когда это педанти c?

Ответы [ 3 ]

2 голосов
/ 01 августа 2020

Позвольте мне процитировать следующую статью Н. Джозаттиса: «[[nodiscard]] в библиотеке » (с некоторыми упущениями, см. Полный текст статьи):

C + +17 представил атрибут [[nodiscard]]. Вопрос в том, где его теперь применить в стандартной библиотеке. Его следует добавить, где:

  • неиспользование возвращаемого значения всегда является «огромной ошибкой» (например, всегда приводит к утечке ресурсов),
  • неиспользование возвращаемого значения является источником проблем и легко может произойти (не очевидно, что что-то не так).

Не следует добавлять, если:

  • неиспользование возвращаемого значения является возможным / общим способ программирования хотя бы для некоторого ввода,
  • без использования возвращаемого значения не имеет смысла, но не повредит и обычно не является ошибкой.

Итак, [[nodiscard]] должно не сигнализировать о плохом коде, если это

  • может быть полезно, чтобы не использовать возвращаемое значение,
  • обычно не использует возвращаемое значение,
  • не повредит и, вероятно, не имелось в виду никакого изменения состояния, которого не происходит.
2 голосов
/ 01 августа 2020

Никогда не обязательно добавлять атрибут [[nodiscard]]. From cppreference :

Если функция, объявленная nodiscard, или функция, возвращающая перечисление или класс, объявленный nodiscard по значению, вызывается из выражения отброшенного значения, отличного от приведения к void, компилятору рекомендуется выдавать предупреждение.

Обратите внимание на последнюю часть: «... компилятору рекомендуется выдавать предупреждение». Что касается стандарта, нет никакой гарантии, что действительно будет предупреждение. Проблема в качестве реализации. Если ваш компилятор выдает предупреждение (прочтите документацию) и если вы обрабатываете такие предупреждения как ошибки, то [[nodiscard]] может оказаться очень полезным.

Это pedanti c использовать атрибут в операторы, в которых отказ от возврата является потенциально ошибкой. Я бы использовал его только при вызове оператора, и отказ от результата всегда является ошибкой logi c. Многие операторы используют возвращаемое значение только для включения цепочки, и [[nodiscard]] скорее будет раздражать таких операторов. Бывают случаи, когда решение не так очевидно, и то, что вы выберете, зависит от мнения и стиля.

1 голос
/ 01 августа 2020

Нужна ли нодискарта на операторах?

Нет. nodiscard и другие атрибуты не являются обязательными.

Или можно с уверенностью предположить, что компилятор выдаст предупреждение, как это делается для большинства подозрительно отброшенных вещей?

Нет никаких гарантий о любом предупреждении на языке, кроме случаев, когда программа плохо сформирована.

Я бы также не принимал предупреждение без nodiscard, потому что во многих случаях результат операции намеренно отбрасывается. Типичный пример:

a = b;  // result of assignment was discarded

Фактически, если все отклоненные результаты приводят к предупреждению, тогда атрибут nodiscard не имеет никакого смысла.

...