【发布时间】: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