为什么 'std::reference_wrapper' 在 c++17 中被弃用,而在 c++20 中被删除?

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

本文关键字:删除 c++20 而在 reference std wrapper 为什么 c++17      更新时间:2023-10-16

自 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 Typedefs 以支持函数绑定器 [depr.func.adaptor.typedefs]"一节中被划掉了。

我们似乎删除它是因为它在旧的函数绑定器 API 中扮演的角色,但它实际上在容器中还有其他用途,如参考页面中所述。我是否缺少一些东西来替换该用例,或者我错过了这种情况的其他东西?

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

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

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

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

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

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

这些活页夹是额外的成员。它们的删除对reference_wrapper规范的其他部分没有影响。