Почему `std::reference_wrapper` устарела в C++17 и удалена в C++20?
Начиная с C++11, std::reference_wrapper
это небольшой шаблон "shim", который является типом класса, который может быть преобразован из ссылочного типа и преобразован в него. Он может использоваться в универсальных контейнерах, которые иначе не поддерживают ссылки.
https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper
std:: reference_wrapper - это шаблон класса, который оборачивает ссылку в копируемый, назначаемый объект. Он часто используется как механизм для хранения ссылок внутри стандартных контейнеров (например, std::vector), которые обычно не могут содержать ссылки.
Эта стандартная библиотечная функция устарела в C++17 и удалена из текущей версии C++20. Зачем?
Является std::reference_wrapper
небезопасно использовать или каким-либо образом неисправен?
В http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0619r3.html кажется, что это часть считается частью "D.8 старых привязок адаптируемых функций" и текст в стандарте с описанием std::reference_wrapper
вычеркнуты в разделе "D.9.2 Typedefs для поддержки связывателей функций [depr.func.adaptor.typedefs]"
Похоже, что мы удаляем его из-за той роли, которую он играл в старом API связывания функций, но на самом деле он имеет дополнительное использование в контейнерах, как описано на странице ссылок. Есть ли что-то, чего мне не хватает, который заменяет этот вариант использования, или что-то еще, что я упустил в этой ситуации?
Если эту полезную функцию удаляют, следует ли нам ее реализовать, когда она нам понадобится, или есть какая-то причина, по которой весь этот шаблон небезопасен?
1 ответ
Эта стандартная библиотечная функция устарела в C++17 и удалена из текущей версии C++20.
Это не устарело и не удалено. Фактически, вы можете найти его в [refwrap] в последней версии.
Ах, вы неправильно поняли формулировку, которая была удалена. "Старые привязки адаптируемых функций" находились в [refwrap] (и других), но они устарели, поэтому они были перенесены в Приложение D. Это означает, что спецификация std::reference_wrapper
был разделен!
Вы можете увидеть это в действии из D9.2p2 вашей связанной бумаги. Это говорит:
Следующие имена членов определены в дополнение к именам, указанным в пункте 23.14:
Эти связующие были дополнительными членами. Их удаление не влияет на другую часть спецификации reference_wrapper
,