C ++ Templates - Panduan Lengkap, Edisi ke-2 memperkenalkan max template:
template<typename T>
T max (T a, T b)
{
// if b < a then yield a else yield b
return b < a ? a : b;
}
Dan itu menjelaskan penggunaan “b < a ? a : b”
bukannya “a < b ? b : a”
:
Perhatikan bahwa maks () templat menurut [StepanovNotes] dengan sengaja mengembalikan “b <a? a: b "bukannya" a <b? b: a ”untuk memastikan bahwa fungsi berperilaku dengan benar meskipun kedua nilai tersebut setara tetapi tidak sama.
Bagaimana cara memahami " even if the two values are equivalent but not equal.
"? “a < b ? b : a”
sepertinya punya hasil yang sama buat saya.
a
dan b
dengan std::addressof
et. Al.
a = max(a, b);
(berulang kali), Anda mungkin tidak ingin mengganti yang a
tidak perlu.
a
dengan salinan a
).
std::addressof
tidak relevan. Padahal, untuk yang diberikan T max(T a, T b)
kita sudah tahu addressof(a) != addressof(b)
.
a
danb
yang setara , maka!(a < b) && !(b < a)
benar, sehinggaa < b
danb < a
keduanya palsu, sehingga dalamb < a ? a : b
,b
dikembalikan, yang tidak apa yang Anda inginkan ... Anda ingina < b ? b : a
.