Pourquoi utiliser “b < a ? a : b” au lieu de “a < b ? b:” pour mettre en œuvre max modèle?

Les Modèles C++ - Le Guide Complet de la 2e Édition introduit le max modèle:

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

Et il explique à l'aide de “b < a ? a : b” au lieu de “a < b ? b : a”:

Noter que le max() modèle selon [StepanovNotes]
intentionnellement renvoie “b < a ? a : b” au lieu de “a < b ? b:” à
s'assurer que la fonction se comporte correctement, même si les deux valeurs sont
équivalent, mais n'est pas égal.

Comment comprendre les "even if the two values are equivalent but not equal."? “a < b ? b : a” semble avoir le même résultat pour moi.

  • Regarde mal pour moi... les Deux réponses sont "correctes", mais si a et b sont équivalent, puis !(a < b) && !(b < a) est vrai, alors a < b et b < a sont faux, donc dans b < a ? a : b, b est retourné, ce qui n'est pas ce que vous voulez... Vous voulez a < b ? b : a.
  • Vous pouvez souvent distinguer entre l'équivalent a et b avec std::addressof et. al.
  • Si vous ne a = max(a, b); (à plusieurs reprises), vous pourriez ne pas vouloir remplacer a inutilement.
  • BTW, ce modèle doit prendre des paramètres par const-références et de les retourner par la const-référence, sinon, vous faites un tas de copies inutiles (et vous allez remplacer a avec une copie de a).
  • L'canonique de type qui a à la fois de l'équivalence et de l'égalité est la CaseInsensitiveString. Pour ce type, ni un<A ni<un. Mais std::addressof n'est pas pertinent. En fait, pour le T max(T a, T b) nous savons déjà addressof(a) != addressof(b).
  • ah, je pensais std::max, n'a pas remarqué le modèle de valeur
  • Vous pouvez consulter Stepano v Notes sur la Programmation pour plus de détails j'ai tweeté à propos de cette après la lecture que parce que l'explication n'était pas assez détaillée.
  • Hilarant. Combien de programmeurs c++ ne prend-il pour écrire le max fonction? Ils devraient peut-être faire deux fonctions maxFirstIfEqual et maxSecondIfEqual juste pour rendre les choses encore plus risible.

InformationsquelleAutor Nan Xiao | 2018-06-13