gpt4 book ai didi

c++ - 为什么 std::sort 不通过引用接受比较器?

转载 作者:IT老高 更新时间:2023-10-28 22:12:30 25 4
gpt4 key购买 nike

standard on std::reference_wrapper解释说 std::sort 现在接受 std::reference_wrapper,允许通过引用传递比较器。

std::sort 一开始没有通过引用接受比较器是否有原因?

最佳答案

简而言之,没有必要引用它;这相当于一个“设计”的决定。

我相信推理集中在 C++ 和标准库中已经存在很长时间的一些基本原理上;

  • 值语义
  • 对实现施加尽可能少的限制

值语义几乎随处可见。几乎所有的算法、容器等都期望其中包含的数据遵守正常的值规则,即表现得好像它们是内置类型一样。这也是 C++ 类型系统背后的原因之一,它使用户类型能够像内置类型一样表现。

算法的实现可以根据需要自由复制函数参数。当允许实现复制仿函数时,将签名限制为引用不是很有用;所以从一开始就允许复制。这意味着函数对象不应该包含任何状态,它可能不会被保留;反过来,这有效地使仿函数非常轻,并且无论如何都没有理由引用。

25.1/10 Algorithms library (C++ draft n3797)

[ Note: Unless otherwise specified, algorithms that take function objects as arguments are permitted to copy those function objects freely. Programmers for whom object identity is important should consider using a wrapper class that points to a noncopied implementation object such as reference_wrapper (20.9.3), or some equivalent solution. —end note ]

关于 API 设计的一般说明。规范和标准的 API 设计,尤其是模板,在最好的情况下是一项不平凡的任务。委员会今天会用 r 值、引用折叠、完美转发和移动语义设计不同的功能吗?我不知道。在我看来,按值获取函数对象平衡了与内部拷贝和移动、可能的优化以及绑定(bind)到临时对象(pr-values/x-values)相关的问题。这里的“通用引用”可能会更好,但我觉得遗留的论点会超过支持改变的论点。

关于c++ - 为什么 std::sort 不通过引用接受比较器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25013168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com