Modèles C ++ - Le guide complet, 2e édition présente le modèle max :
template<typename T>
T max (T a, T b)
{
// if b < a then yield a else yield b
return b < a ? a : b;
}
Et cela explique l'utilisation “b < a ? a : b”au lieu de “a < b ? b : a”:
Notez que le modèle max () selon [StepanovNotes] renvoie intentionnellement «b <a? a: b »au lieu de« a <b? b: a ”pour s'assurer que la fonction se comporte correctement même si les deux valeurs sont équivalentes mais non égales.
Comment comprendre " even if the two values are equivalent but not equal."? “a < b ? b : a”semble avoir le même résultat pour moi.
aet bavec std::addressofet. Al.
a = max(a, b);(à plusieurs reprises), vous ne voudrez peut-être pas remplacer ainutilement.
aavec une copie de a).
std::addressofn'est pas pertinent. En fait, pour le donné, T max(T a, T b)nous savons déjà addressof(a) != addressof(b).
aetbsont équivalentes , alors!(a < b) && !(b < a)est vrai, donca < betb < asont toutes les deux fausses, donc inb < a ? a : b,best renvoyée, ce qui n'est pas ce que vous voulez ... Vous vouleza < b ? b : a.