Шаблони 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”:
Зауважте, що шаблон max () відповідно до [StepanovNotes] навмисно повертає “b <a? a: b »замість« a <b? b: a ”, щоб переконатися, що функція поводиться правильно, навіть якщо два значення є рівнозначними, але не рівними.
Як зрозуміти " even if the two values are equivalent but not equal."? “a < b ? b : a”здається, для мене такий же результат.
aі bз std::addressofет. ін.
a = max(a, b);(неодноразово), можливо, ви не захочете aзайво замінювати .
aкопію a).
std::addressofце не має значення. Насправді, для даного T max(T a, T b)ми вже знаємо addressof(a) != addressof(b).
aіbє рівнозначними , то!(a < b) && !(b < a)це правда, такa < bіb < aобидві помилкові, тому вb < a ? a : b,bповертається, що не те, що ви хочете ... Ви хочетеa < b ? b : a.