Modelos C ++ - O Guia Completo, 2ª Edição, apresenta o modelo máximo :
template<typename T>
T max (T a, T b)
{
// if b < a then yield a else yield b
return b < a ? a : b;
}
E explica como usar, em “b < a ? a : b”vez de “a < b ? b : a”:
Observe que o modelo max () de acordo com [StepanovNotes] retorna intencionalmente “b <a? a: b "em vez de" a <b? b: a ”para garantir que a função se comporte corretamente, mesmo que os dois valores sejam equivalentes, mas não iguais.
Como entender " even if the two values are equivalent but not equal."? “a < b ? b : a”parece ter o mesmo resultado para mim.
ae bcom std::addressofet. al.
a = max(a, b);(repetidamente), talvez você não queira substituí-lo adesnecessariamente.
apor uma cópia de a).
std::addressofé irrelevante. De fato, pelo T max(T a, T b)que já sabemos addressof(a) != addressof(b).
aebsão equivalentes , em seguida,!(a < b) && !(b < a)é verdade, entãoa < beb < asão ambas falsas, portanto, emb < a ? a : b,bé devolvido, o que não é o que você quer ... Você quera < b ? b : a.