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

时间:2018-08-08 03:05:31

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

自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中扮演过角色,但实际上它在容器中还有其他用途,如参考页所述。我是否缺少替代用例的东西,或者在这种情况下还缺少的东西?

如果要删除此有用功能,我们应该在需要时实施它,还是有某种原因使整个模式不安全?

1 个答案:

答案 0 :(得分:8)

  

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

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

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

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

  

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

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