Почему std :: move не [[nodiscard]] в С++ 20?

Я недавно читал о [[nodiscard]] в С++ 17, и насколько я понимаю, это новая функция (дизайн по контракту?), [[nodiscard]] заставляет вас использовать возвращаемое значение. Это имеет смысл для спорных функций, таких как std::launder launder (nodiscard начиная с С++ 20), но мне интересно, почему std::move не определен так, как в С++ 17/20. Знаете ли вы вескую причину или это потому, что С++ 20 еще не завершен?

Ответы

Ответ 1

AFAIK P0600R1 - единственное предложение по добавлению [[nodiscard]] в стандартную библиотеку, которая была применена к С++ 20. Из этой статьи:

Мы предлагаем консервативный подход:

[...]

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

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

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

  • [...]
  • не больно и, вероятно, не было никакого изменения состояния, что не произойдет

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

Ответ 2

Команда стандартных библиотек MSVC пошла дальше и добавила несколько тысяч экземпляров [[nodiscard]] с [[nodiscard]] VS 2017 15.6 и сообщила о [[nodiscard]] успехе с ней (как с точки зрения обнаружения множества ошибок, так и отсутствия жалоб пользователей). Критерии, которые они описали, были приблизительно:

  1. Чистые наблюдатели, например, vector::size(), vector::empty и даже std::count_if()
  2. Вещи, которые получают сырые ресурсы, например, allocate()
  3. Функции, где отбрасывание возвращаемого значения с большой вероятностью приведет к неправильному коду, например, std::remove()

MSVC помечает как std::move() и std::forward() как [[nodiscard]] соответствии с этими критериями.

Хотя это официально не аннотировано как таковое в стандарте, оно, кажется, обеспечивает явную выгоду для пользователя, и это больше вопрос разработки такой бумаги, чтобы пометить все правильные вещи [[nodiscard]] (опять же, несколько тысяч экземпляров из MSVC) и применить Их - это не сложная работа как таковая, но объем большой. А пока, может, подтолкнуть вашего любимого поставщика стандартной библиотеки и попросить у него [[nodiscard]] много вещей?