これは、「Strict Weak Orderingルール」と呼ばれ、例えば、SGI のStandard Template Library Programmer's Guideにも、Strict Weak Orderingという専用のページが存在しています。また、Effective STLでは、第21項に「等しい値に対して比較関数が常にfalseを返すようにしよう」という、そのものズバリの項目があります。
にも関わらず、私は、この件をすっかり忘れており、自分のコードの比較関数で、等しい値に対して true を返していました...。
この間違いが発覚したのは、問題のコードをWindowsのVisual C++ 2005でコンパイルして実行した時。普段はgccを使っていますが、マルチプラットフォーム対応の一環で、自分のコードをWindows上でも動作するようにしました。
すると、なんと Visual C++ では、debug モードが有効になっている場合、STLの比較関数呼び出し実行時、引数の前後を入れ替え、必ずどちらかが false になることを調べてくれるのです! 私のコードでは、何れに於いても true を返すことになりますから、このチェックに引っかかり、無事に問題を発見することが出来ました。
Visual C++を(少しだけ)見直した瞬間でした。感謝。
...べ、べつに、VC++に惚れたわけじゃ、ないんだからねっ!
0 件のコメント:
コメントを投稿