Mẫu C ++ - Hướng dẫn hoàn chỉnh, Phiên bản 2 giới thiệu mẫu tối đa :
template<typename T>
T max (T a, T b)
{
// if b < a then yield a else yield b
return b < a ? a : b;
}
Và nó giải thích bằng cách sử dụng “b < a ? a : b”
thay vì “a < b ? b : a”
:
Lưu ý rằng mẫu max () theo [StepanovNotes] cố ý trả về bản b <a? a: bv thay vì thế a <b? b: một giá trị để đảm bảo rằng hàm hoạt động chính xác ngay cả khi hai giá trị tương đương nhưng không bằng nhau.
Làm sao để hiểu " even if the two values are equivalent but not equal.
"? “a < b ? b : a”
dường như có kết quả tương tự với tôi
a
và b
với std::addressof
et. al.
a = max(a, b);
(lặp đi lặp lại), bạn có thể không muốn thay thế một cách a
không cần thiết.
a
bằng một bản sao a
).
std::addressof
là không liên quan. Trong thực tế, cho đã cho T max(T a, T b)
chúng ta đã biết addressof(a) != addressof(b)
.
a
vàb
là tương đương , sau đó!(a < b) && !(b < a)
là sự thật, vì vậya < b
vàb < a
cả hai đều sai, vì vậy trongb < a ? a : b
,b
được trả lại, mà không phải là những gì bạn muốn ... Bạn muốna < b ? b : a
.