C++ Templates - The Complete Guide, 2nd Edition introduces the max template:
template<typename T>
T max (T a, T b)
{
// if b < a then yield a else yield b
return b < a ? a : b;
}
And it explains using “b < a ? a : b”
instead of “a < b ? b : a”
:
Note that the max() template according to [StepanovNotes] intentionally returns “b < a ? a : b” instead of “a < b ? b : a” to ensure that the function behaves correctly even if the two values are equivalent but not equal.
How to understand "even if the two values are equivalent but not equal.
"? “a < b ? b : a”
seems have the same result for me.
std::max(a, b)
is indeed specified to return a
when the two are equivalent.
That's considered a mistake by Stepanov and others because it breaks the useful property that given a
and b
, you can always sort them with {min(a, b), max(a, b)}
; for that, you'd want max(a, b)
to return b
when the arguments are equivalent.