【问题标题】:Why std::clamp changed how comparison is done in C++20?为什么 std::clamp 改变了 C++20 中的比较方式?
【发布时间】:2021-07-14 20:02:37
【问题描述】:

有一个关于 C++ 参考的有趣注释,用于 std::clamp(one 的第一次重载,它不采用自定义比较器)。

使用 operator (C++20 起) 比较 价值观。

我在 cppreference 上发现的只有这个(关于 std::less),但这似乎是边缘无用的动机,因为“大多数”(所有)实现都知道如何比较指针。

任何指针类型的 std::less 特化都会产生 实现定义的严格总顺序,即使内置

【问题讨论】:

  • “实现知道如何比较指针”不,它们不知道,它们(至少 gcc)执行一些优化,假设您只将指针与< 比较到同一个对象。跨度>
  • 实现知道如何比较指针,并且该知识嵌入在 std::less 中。在某些架构上,比较指向数组中元素的指针可能比比较不相关的指针更简单。当你想比较不相关的指针时,你必须使用std::less,这样实现知道它必须做额外的工作,如果适用的话。
  • 它稍微收紧了规范——这是最近 C++ 标准的一个趋势(例如,将以前未定义或未指定的行为更改为实现定义)。当比较两个不相关的指针(不是同一个对象的一部分)时,< 的行为是未指定的,但std::less 的行为是实现定义的。粗略地说,实现定义(标准指定约束,实现必须记录选择)被认为比未指定(实现可以在约束内做它喜欢的事情)更可取。
  • 在比较指针时:“...许多实现还提供了随机来源指针的严格总排序,例如,如果它们被实现为连续虚拟地址空间内的地址。那些不(例如,并非指针的所有位都是内存地址的一部分并且必须忽略比较,或者需要额外的计算,否则指针和整数不是 1 对 1 的关系),提供 std:: 的特化对于具有该保证的指针,更少……” en.cppreference.com/w/cpp/language/pointer

标签: c++ stl c++20 clamp


【解决方案1】:

这只是一个wording clarification,它不会改变算法的任何含义。

【讨论】:

  • 但 std::less 不是合法定制点吗?尽管您可能应该只正确定义 <...>
  • @NoSenseEtAl 这是合法的。 Cppreference 没有说不是,而是说“除非专门化 [does X]”
  • @NoSenseEtAl 不是在使用std::less&lt;T&gt;,而是在使用std::less&lt;void&gt;
  • @Deduplicator 嗯? std::less&lt;&gt;{}(x, y) 始终计算为 x &lt; y
  • 是吗?对于指针,它似乎是与 std::less 一致的完整顺序,而不是
猜你喜欢
  • 2021-04-28
  • 2020-10-01
  • 2021-05-24
  • 2020-08-06
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多