【发布时间】:2018-11-22 20:26:45
【问题描述】:
C++ Templates - The Complete Guide, 2nd Edition 介绍max 模板:
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] 的 max() 模板 故意返回“b
如何理解“even if the two values are equivalent but not equal.”? “a < b ? b : a” 似乎对我有同样的结果。
【问题讨论】:
-
对我来说看起来不对...两个答案都是“正确的”,但如果
a和b等效,那么!(a < b) && !(b < a)是正确的,所以 @ 987654332@ 和b < a都是假的,所以在b < a ? a : b中,b被返回,这不是你想要的......你想要a < b ? b : a。 -
如果您(重复)使用
a = max(a, b);,您可能不想不必要地替换a。 -
顺便说一句,此模板应通过 const-references 获取参数并通过 const-reference 返回它们,否则,您将做一堆无用的副本(并且您将使用以下副本覆盖
aa)。 -
@Caleth:同时具有等价和等价的规范类型是 CaseInsensitiveString。对于该类型,既不是 astd::addressof 无关紧要。事实上,对于给定的
T max(T a, T b),我们已经知道addressof(a) != addressof(b)。 -
你可以参考Stepano'v Notes on Programming for more details我在推特上看到这个因为解释不够详细。