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.
a
e b
com std::addressof
et. al.
a = max(a, b);
(repetidamente), talvez você não queira substituí-lo a
desnecessariamente.
a
por uma cópia de a
).
std::addressof
é irrelevante. De fato, pelo T max(T a, T b)
que já sabemos addressof(a) != addressof(b)
.
a
eb
são equivalentes , em seguida,!(a < b) && !(b < a)
é verdade, entãoa < b
eb < a
são ambas falsas, portanto, emb < a ? a : b
,b
é devolvido, o que não é o que você quer ... Você quera < b ? b : a
.