std::sort
函数依赖于某种形式的成对比较子例程。该子例程可以采用明确提供的比较函数的形式,或者可以采用operator<
重载的形式。在任何一种情况下,比较器必须定义严格的弱排序。如果比较器没有定义这样的排序,那么这会导致未定义的行为。 this Stack Overflow question中提供了一个示例。根据我自己的经验,我遇到了将两个对象的数据与<=
而不是<
进行比较会导致一系列非确定性错误(包括堆栈或堆损坏和分段错误)的情况。
所以我的问题是:是否存在任何工具来识别不执行严格弱序的无效比较器?
我原本希望找到一个GCC标志(例如“-Werror = require-strict-weak-ordering”),但我找不到这样的东西。考虑到这些错误的引入是多么容易,它们的诊断难度,以及可能的影响有多广泛,我很惊讶某种形式的自动检测不是GCC的默认设置。即使在编译时无法检测到这种情况,运行时断言也会非常有用。任何东西都会比腐败的堆栈和猜测时间更好。