Modelli C ++ - La guida completa, 2a edizione introduce il modello massimo :
template<typename T>
T max (T a, T b)
{
// if b < a then yield a else yield b
return b < a ? a : b;
}
E spiega l'utilizzo “b < a ? a : b”anziché “a < b ? b : a”:
Si noti che il modello max () secondo [StepanovNotes] restituisce intenzionalmente “b <a? a: b "anziché" a <b? b: a ”per garantire che la funzione si comporti correttamente anche se i due valori sono equivalenti ma non uguali.
Come capire "even if the two values are equivalent but not equal. "? “a < b ? b : a”sembra avere lo stesso risultato per me.
ae bcon std::addressofet. al.
a = max(a, b);(ripetutamente) potresti non voler sostituire ainutilmente.
acon una copia di a).
std::addressofè irrilevante. In effetti, per il dato T max(T a, T b)lo sappiamo già addressof(a) != addressof(b).
aebsono equivalenti , allora!(a < b) && !(b < a)è vero, quindia < beb < asono entrambe false, quindi inb < a ? a : b,bviene restituito, che non è quello che vuoi ... Tu vuoia < b ? b : a.