เทมเพลต C ++ - คู่มือฉบับสมบูรณ์ฉบับที่ 2แนะนำเทมเพลตสูงสุด :
template<typename T>
T max (T a, T b)
{
// if b < a then yield a else yield b
return b < a ? a : b;
}
และมันอธิบายการใช้“b < a ? a : b”
แทน“a < b ? b : a”
:
โปรดทราบว่าเทมเพลตสูงสุด () ตาม [StepanovNotes] จะส่งคืนโดยเจตนา“ b <a? a: b” แทนที่จะเป็น“ a <b? b: a” เพื่อให้แน่ใจว่าฟังก์ชั่นทำงานอย่างถูกต้องแม้ว่าค่าทั้งสองจะเท่ากัน แต่ไม่เท่ากัน
วิธีทำความเข้าใจ " even if the two values are equivalent but not equal.
" “a < b ? b : a”
ดูเหมือนจะมีผลเหมือนกันสำหรับฉัน
a
และb
กับstd::addressof
et อัล
a = max(a, b);
(ซ้ำ ๆ ) คุณอาจไม่ต้องการแทนที่a
โดยไม่จำเป็น
a
ด้วยสำเนาa
)
std::addressof
ไม่เกี่ยวข้อง ในความเป็นจริงสำหรับให้เรารู้อยู่แล้วว่าT max(T a, T b)
addressof(a) != addressof(b)
a
และb
เป็นเทียบเท่าแล้ว!(a < b) && !(b < a)
เป็นความจริงดังนั้นa < b
และb < a
มีทั้งที่เป็นเท็จดังนั้นในb < a ? a : b
,b
จะถูกส่งกลับซึ่งไม่ได้เป็นสิ่งที่คุณต้องการ ...a < b ? b : a
คุณต้องการ