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;
}
Run Code Online (Sandbox Code Playgroud)
它解释了使用“b < a ? a : b”而不是“a < b ? b : a”:
请注意,根据[StepanovNotes]的max()模板有意返回"b <a?a:b"而不是"a <b?b:"确保即使两个值相等但不相等,函数也能正常运行.
怎么理解" even if the two values are equivalent but not equal."?“a < b ? b : a”对我来说似乎有相同的结果.
T.C*_*.C. 150
std::max(a, b)确实指定a在两者相等时返回.
这是考虑了一个错误斯捷潘诺夫和其他人,因为它打破了给出的有用的属性a和b,你可以随时对它们进行排序{min(a, b), max(a, b)}; 为此,你想要在参数相同时max(a, b)返回b.
Hol*_*olt 62
这个答案解释了为什么从C++标准的观点来看给定的代码是错误的,但它是脱离了上下文的.
有关上下文解释,请参阅@ TC的答案.
标准定义std::max(a, b)如下[alg.min.max](重点是我的):
Run Code Online (Sandbox Code Playgroud)template<class T> constexpr 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
Run Code Online (Sandbox Code Playgroud)
......似乎是正确的答案.这是libstdc ++和libc ++使用的版本.
因此,根据当前标准,引用中的信息似乎是错误的,但定义它的上下文可能不同.
son*_*yao 21
关键是当它们是等价的时候应该归还哪一个; 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
Run Code Online (Sandbox Code Playgroud)