use*_*832 5 c++ stl undefined-behavior
考虑以下代码:
std::sort(vec.begin(), vec.end(),
[](const Foo& lhs, const Foo& rhs) { return !(lhs < rhs); }
);
Run Code Online (Sandbox Code Playgroud)
如果lhs == rhs,lambda(lhs,rhs)和lambda(rhs,lhs)都将返回true,这违反了提供严格弱排序的要求.但是,标准是否明确标记将这样的比较器传递为未定义的行为?
警告:极端语言律师随之而来。
标准最新草案的措辞在 [alg.sorting]p3 中是这样表述的:
对于所有采用 的算法
Compare,都有一个版本使用operator<。也就是说,comp(*i, *j) != false默认为*i < *j != false. 对于 25.4.3 中描述的算法以外的算法,comp 应对值进行严格的弱排序。
通过使用“应”一词,该标准隐含地表明违反该标准会导致未定义的行为。
标准中尚不清楚这是否要求给定函数对所有可能的值施加 SWO,还是仅对给定算法的值施加 SWO。然而,由于限制是在讨论这些特定算法的段落中陈述的,因此假设它指的是提供给算法的值的范围并不是没有道理的。
否则,由于 NaN,默认情况operator<下无法对 s 强加 SWO 。float
| 归档时间: |
|
| 查看次数: |
845 次 |
| 最近记录: |