为什么`std :: reference_wrapper`在c ++ 17中已弃用并在c ++ 20中被删除?

Chr*_*eck 1 c++ c++11 reference-wrapper c++17 c++20

从C++ 11开始,它std::reference_wrapper是一个小的"垫片"模板,它是一种类型,可以从引用类型构造并转换为引用类型.它可以在通用容器中使用,否则可能不支持引用.

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#2.0中 ,似乎这部分被认为是"D.8旧适应性功能绑定"的一部分,标准描述中的文本在std::reference_wrapper"D.9.2 Typedef to Support Function Binders [depr.func.adaptor.typedefs]"部分中划掉

看来我们正在删除它,因为它在旧的函数绑定器API中扮演了一个角色,但它实际上在容器中有其他用途,如参考页面所述.是否有一些我遗漏的东西取代了那个用例,或者我错过了这种情况的其他东西?

如果要删除这个有用的功能,我们是否应该在需要时实现它,或者是否有某些原因导致整个模式不安全?

Rak*_*111 10

此标准库功能在C++ 17中已弃用,并在当前的C++ 20草案中删除.

它没有被弃用,也没有删除.事实上,您可以在最新草案的[refwrap]下找到它.

啊,你误解了被删除的措辞."旧的自适应功能绑定"在[refwrap](和其他)下,但它们已被弃用,因此它们被移至附录D.这意味着规范std::reference_wrapper被拆分了!

您可以从链接纸张的D9.2p2中看到这一点.它说:

除了第23.14节中指定的名称外,还定义以下成员名称:

这些粘合剂是其他成员.它们的删除对规范的其他部分没有影响reference_wrapper.