【问题标题】:Why is `std::reference_wrapper` deprecated in c++17 and removed in c++20?为什么 `std::reference_wrapper` 在 c++17 中被弃用并在 c++20 中被删除?
【发布时间】:2019-01-15 05:03:00
【问题描述】:

自 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#2.0 似乎这被认为是“D.8 旧自适应函数绑定”的一部分,并且标准中描述 std::reference_wrapper 的文本在“D.9.2 Typedefs to Support Function Binders [depr.func.adaptor.typedefs ]"

看起来我们正在删除它,因为它在旧的函数绑定 API 中发挥了作用,但它实际上在容器中还有其他用途,如参考页面所述。是否有我遗漏的东西可以替代该用例,或者我在这种情况下遗漏了什么?

如果这个有用的特性被删除了,我们应该在需要的时候实现它,还是有什么原因导致整个模式不安全?

【问题讨论】:

  • 唯一弃用和删除的是成员 typedefs。
  • 谢谢,既然这个问题是一个简单的误解,你认为我应该关闭它,删除它,还是离开它?
  • @ChrisBeck 如果您有这种误解,那么其他人也会有这种误解并非不可能。保留它可能是合适的。

标签: c++ c++11 c++17 c++20 reference-wrapper


【解决方案1】:

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

它没有被弃用,也没有被删除。其实最新一稿的[refwrap]下可以找到。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2022-01-28
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多