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.
a
e b
con std::addressof
et. al.
a = max(a, b);
(ripetutamente) potresti non voler sostituire a
inutilmente.
a
con 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)
.
a
eb
sono equivalenti , allora!(a < b) && !(b < a)
è vero, quindia < b
eb < a
sono entrambe false, quindi inb < a ? a : b
,b
viene restituito, che non è quello che vuoi ... Tu vuoia < b ? b : a
.