自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中扮演过角色,但实际上它在容器中还有其他用途,如参考页所述。我是否缺少替代用例的东西,或者在这种情况下还缺少的东西?
如果要删除此有用功能,我们应该在需要时实施它,还是有某种原因使整个模式不安全?
答案 0 :(得分:8)
此标准库功能已在C ++ 17中弃用,并在当前的C ++ 20草案中已删除。
它不被弃用,也没有被删除。实际上,您可以在最新草案的[refwrap]下找到它。
啊,您误会了被删除的措词。 “旧的可适应函数绑定”在[refwrap](及其他)下,但已弃用,因此将它们移至附录D。这意味着std::reference_wrapper
的规范已被拆分!
您可以从链接的论文的D9.2p2中看到这一点。它说:
在第23.14条中指定的名称之外,定义了以下成员名称:
那些活页夹是其他个成员。将其删除对reference_wrapper
规范的其他部分没有影响。