3

从 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 中发挥了作用,但它实际上在容器中还有其他用途,如参考页面中所述。有没有我遗漏的东西可以代替那个用例,或者我错过了关于这种情况的其他东西?

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

4

1 回答 1

15

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

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

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

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

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

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

于 2018-08-08T03:12:37.153 回答