为什么 'std::reference_wrapper' 在 c++17 中被弃用,而在 c++20 中被删除?
Why is `std::reference_wrapper` deprecated in c++17 and removed in c++20?
自 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
规范的其他部分没有影响。
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 用C++20 fmt限制结果的总大小
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 如何在C++20中创建模板别名的推导指南
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 宏"断言"会在 C++20 中删除吗?
- 为什么 'std::reference_wrapper' 在 c++17 中被弃用,而在 c++20 中被删除?
- 为什么许多标准库类型在 C++20 中删除 operator!=?
- 是否可以在 C++ 20 中完成概念的删除关键字模板?
- 如果构造函数被显式默认或删除,为什么聚合初始化自 C++20 以来不再起作用