Почему 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]]
успехе с ней (как с точки зрения обнаружения множества ошибок, так и отсутствия жалоб пользователей). Критерии, которые они описали, были приблизительно:
- Чистые наблюдатели, например,
vector::size()
, vector::empty
и даже std::count_if()
- Вещи, которые получают сырые ресурсы, например,
allocate()
- Функции, где отбрасывание возвращаемого значения с большой вероятностью приведет к неправильному коду, например,
std::remove()
MSVC помечает как std::move()
и std::forward()
как [[nodiscard]]
соответствии с этими критериями.
Хотя это официально не аннотировано как таковое в стандарте, оно, кажется, обеспечивает явную выгоду для пользователя, и это больше вопрос разработки такой бумаги, чтобы пометить все правильные вещи [[nodiscard]]
(опять же, несколько тысяч экземпляров из MSVC) и применить Их - это не сложная работа как таковая, но объем большой. А пока, может, подтолкнуть вашего любимого поставщика стандартной библиотеки и попросить у него [[nodiscard]]
много вещей?