为什么使用“b < a ? a : b" 而不是 "a < b ? b : a” 来实现最大模板?

新手上路,请多包涵

C++ 模板 - 完整指南,第 2 版 介绍了 最大 模板:

 template<typename T>
T max (T a, T b)
{
  // if b < a then yield a else yield b
  return  b < a ? a : b;
}

它解释了使用 “b < a ? a : b” 而不是 “a < b ? b : a”

请注意,根据 [StepanovNotes] 的 max() 模板有意返回“b < a ? a : b” 而不是 “a < b ? b : a” 以确保即使两个值相等但不相等,函数也能正确运行。

如何理解“ even if the two values are equivalent but not equal. ”? “a < b ? b : a” 对我来说似乎有相同的结果。

原文由 Nan Xiao 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

std::max(a, b) 确实指定返回 a 当两者相等时。

Stepanov 和其他人认为这是一个错误,因为它破坏了给出 ab 的有用属性,您始终可以使用 {min(a, b), max(a, b)} 对它们进行排序为此,当参数相等时,您希望 max(a, b) 返回 b

原文由 T.C. 发布,翻译遵循 CC BY-SA 4.0 许可协议

这个答案解释了为什么从 C++ 标准的角度来看给定的代码是错误的,但它是脱离上下文的。

有关上下文解释,请参阅 @TC 的答案


该标准定义 std::max(a, b) 如下 [alg.min.max] (重点是我的):

>  template<class T> constexpr const T& max(const T& a, const T& b);
>
> ```
>
> _要求_:类型 T 是 LessThanComparable(表 18)。
>
> _返回_:较大的值。
>
> _备注_: **当参数相等时返回第一个参数。**

这里的等价意味着 `!(a < b) && !(b < a)` 是 `true` [\[alg.sorting#7\]](http://eel.is/c++draft/alg.sorting#7) 。

In particular, if `a` and `b` are equivalent, both `a < b` and `b < a` are `false` , so the value在 `:` 的右边将在条件运算符中返回,所以 `a` 必须在右边,所以:

a < b ? b : a

”`

…似乎是正确的答案。这是 libstdc++libc++ 使用的版本。

因此,根据当前标准,您报价中的信息似乎是错误的,但定义它的上下文可能会有所不同。

原文由 Holt 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题