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的max()模板有意返回“b
如何理解"even if the two values are equivalent but not equal.
"?“a < b ? b : a”
似乎对我也有同样的结果。
发布于 2018-06-13 11:15:27
实际上,指定std::max(a, b)
返回a
时两者是等价的。
斯捷潘诺夫和其他人认为这是一个错误,因为它破坏了给定a
和b
的有用属性,因此可以使用{min(a, b), max(a, b)}
对它们进行排序;为此,当参数相等时,希望max(a, b)
返回b
。
发布于 2018-06-13 10:05:52
这个答案解释了为什么从C++标准的角度来看,给定的代码是错误的,但它是脱离上下文的。
有关上下文的解释,请参见@T.C.的答案。
该标准将std::max(a, b)
定义为以下[alg.min.max] (重点是我的):
模板const T& max(const T& a,const T& b); 要求:T类型为LessThanComparable (表18)。 返回:较大的值。 备注:当参数等效时,返回第一个参数.
这里等价的意思是!(a < b) && !(b < a)
是true
[alg.sorting#7]。
特别是,如果a
和b
是等价的,那么a < b
和b < a
都是false
,因此:
右侧的值将在条件运算符中返回,因此a
必须位于右侧,因此:
a < b ? b : a
...seems是正确的答案。这是libstdc++和libc++使用的版本。
因此,根据当前的标准,报价中的信息似乎是错误的,但是定义它的上下文可能是不同的。
发布于 2018-06-13 09:50:39
关键是当它们等价时应该返回哪一个;对于这种情况,std::max
必须返回a
(即第一个参数)。
如果它们相等,则返回
a
。
因此,应该使用a < b ? b : a
;另一方面,b < a ? a : b;
将错误地返回b
。
(正如@Holt所说,这句话似乎正好相反。)
“这两个值是等价的,但不相等”意味着它们在被比较时具有相同的值,但它们在其他方面可能是不同的对象。
例如:
struct X { int a; int b; };
bool operator< (X lhs, X rhs) { return lhs.a < rhs.a; }
X x1 {0, 1};
X x2 {0, 2};
auto x3 = std::max(x1, x2); // it's guaranteed that an X which cantains {0, 1} is returned
https://stackoverflow.com/questions/50834117
复制相似问题