less 的使用

  • 使用 less 替代 < 运算符可以让你的算法更加通用。例如, 当算法作用于无法提供 < 运算符的类型上时,该类型可以通过自定义 less 的重载版本,以继续工作。
  • 当代码会对比较结果是未定义的[1]的指针进行比较时,一定要使用 std::less。C++ 标准规定 std::less 对任何指针类型生成的特化版本都实现严格全序,它保证能够安全的对指针进行比较。

扩展:

C++ Prime 第五版的中文译者曾在书中附注道 “less 的默认实现用的就是 < 运算符[2],所以其并未起到比较有良好定义的作用”。 这是错误的,less 的默认实现使用 < 运算符是因为指针的主流[3]实现是严格全序的(例如,指针被实现为存储连续虚拟地址空间内的地址),因此其可以直接使用 < 运算符比较。而那些没有这样实现的平台(例如,指针存储的内容不完全是内存地址),则是会提供具有严格全序保证的 std::less 特化版本。

上文内容也适用与 greater、less_equal、greater_equal。

参考:


  1. 这会导致同一比较运算可能返回不同的值,甚至在同一行代码中多个相同的比较运算可能返回不同的值 ↩︎

  2. libstdc++、libc++ 和 MSVC STL 皆是如此 ↩︎

  3. 指主流处理器(系统或编译器或许也有能力决定指针的实现方式,但我不确定) ↩︎

posted @ 2022-09-05 22:02  邓加领  阅读(177)  评论(0)    收藏  举报