C++模板 - 完全指南,第二版介绍了max模板:
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”,以确保即使两个值相等但不相等,函数也能正确地运行。
如何理解“即使两个值相等但不相等。”?对我来说,
“a < b ? b : a”
似乎具有相同的结果。
a
和b
是等价的,那么!(a < b) && !(b < a)
为真,因此a < b
和b < a
都为假,所以在b < a ? a : b
中,返回的是b
,这不是你想要的...你需要的是a < b ? b : a
。 - Holta = max(a, b);
,你可能不想无谓地替换掉a
。 - Bo Perssona
的副本覆盖a
)。 - Holtstd::addressof
是无关紧要的。实际上,对于给定的“T max(T a, T b)”,我们已经知道addressof(a)!= addressof(b)
。 - MSalters