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

Why is `std::reference_wrapper` deprecated in c++17 and removed in c++20?

自 C++11 起,std::reference_wrapper 是一个小型 "shim" 模板,它是一个 class 类型,可从引用类型构造并转换为引用类型。它可以在可能不支持引用的通用容器中使用。

https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper

std::reference_wrapper is a class template that wraps a reference in a copyable, assignable object. It is frequently used as a mechanism to store references inside standard containers (like std::vector) which cannot normally hold references.

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

std::reference_wrapper使用不安全或有缺陷吗?

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0619r3.html#2.0 看起来这部分被认为是 "D.8 Old adaptable function bindings" 的一部分,标准中描述 std::reference_wrapper 的文本在 "D.9.2 Typedefs to Support Function Binders [depr.func.adaptor.typedefs]"

部分被划掉了

我们删除它似乎是因为它在旧函数绑定器中发挥了作用 API,但它实际上在容器中有其他用途,如参考页所述。是否有我遗漏的东西来代替那个用例,或者我错过了关于这种情况的其他东西?

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

This standard library feature was deprecated in C++17 and is removed in the current draft of C++20.

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

啊,你误解了被删除的措辞。 "old adaptable function bindings" 在 [refwrap](和其他)下,但它们已被弃用,因此它们被移至附录 D。这意味着 std::reference_wrapper 的规范被拆分了!

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

The following member names are defined in addition to names specified in Clause 23.14:

那些活页夹是 额外的 成员。它们的删除对 reference_wrapper.

规范的其他部分没有影响