Почему `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,

Другие вопросы по тегам