Я недавно читал о [[nodiscard]] в С++ 17, и насколько я понимаю, это новая функция (дизайн по контракту?), [[nodiscard]] заставляет вас использовать возвращаемое значение. Это имеет смысл для спорных функций, таких как std::launder launder (nodiscard начиная с С++ 20), но мне интересно, почему std::move не определен так, как в С++ 17/20. Знаете ли вы вескую причину или это потому, что С++ 20 еще не завершен?
Почему std :: move не [[nodiscard]] в С++ 20?
Ответ 1
AFAIK P0600R1 - единственное предложение по добавлению [[nodiscard]] в стандартную библиотеку, которая была применена к С++ 20. Из этой статьи:
Мы предлагаем консервативный подход:
[...]
Не следует добавлять, когда:
- [...]
- не использовать возвращаемое значение не имеет смысла, но не повредит и обычно не является ошибкой
- [...]
Таким образом, [[nodiscard]] не должен сигнализировать о плохом коде, если это
- [...]
- не больно и, вероятно, не было никакого изменения состояния, что не произойдет
Таким образом, причина в том, что стандартная библиотека использует консервативный подход, а более агрессивный еще не предложен.
Ответ 2
Команда стандартных библиотек MSVC пошла дальше и добавила несколько тысяч экземпляров [[nodiscard]] с [[nodiscard]] VS 2017 15.6 и сообщила о [[nodiscard]] успехе с ней (как с точки зрения обнаружения множества ошибок, так и отсутствия жалоб пользователей). Критерии, которые они описали, были приблизительно:
- Чистые наблюдатели, например,
vector::size(),vector::emptyи дажеstd::count_if() - Вещи, которые получают сырые ресурсы, например,
allocate() - Функции, где отбрасывание возвращаемого значения с большой вероятностью приведет к неправильному коду, например,
std::remove()
MSVC помечает как std::move() и std::forward() как [[nodiscard]] соответствии с этими критериями.
Хотя это официально не аннотировано как таковое в стандарте, оно, кажется, обеспечивает явную выгоду для пользователя, и это больше вопрос разработки такой бумаги, чтобы пометить все правильные вещи [[nodiscard]] (опять же, несколько тысяч экземпляров из MSVC) и применить Их - это не сложная работа как таковая, но объем большой. А пока, может, подтолкнуть вашего любимого поставщика стандартной библиотеки и попросить у него [[nodiscard]] много вещей?