<
演算子がC++でオーバーロードされている場合(たとえば、カスタム構造体をstd::set
に挿入する場合)、実装は基底型の上にstrict weak orderでなければならないことを理解しています。std :: setと<Operator Overloadingの不思議な振る舞い?
struct
と実装について考えてみましょう。この実装では、厳密な弱いためではありませんが、コードがコンパイルされ、エラーを投げずに(私は厳密に弱いための要件を考えると、エラーをスローすることを期待する)を実行します:
#include <iostream>
#include <set>
using namespace std;
struct Pixel {
int x;
int y;
};
bool operator < (Pixel lhs, Pixel rhs){
return lhs.x < rhs.x || lhs.y < rhs.y;
};
int main(){
set<Pixel> mySet;
Pixel *newPixelA = new Pixel;
newPixelA->x = 1;
newPixelA->y = 3;
Pixel *newPixelB = new Pixel;
newPixelB->x = 4;
newPixelB->y = 2;
mySet.insert(*newPixelA);
mySet.insert(*newPixelB);
}
はこれです期待される行動は?編集:Xcodeを使用します。
定義されていない動作は未定義です。 「働くと思われる」は、未定義の動作の可能性のある表現の1つです。 –
あなたの「見えるものは」実際にあなたが観察したものの正確な記述です。挿入のためにソースオブジェクトを動的に割り当てる理由も不明です。 – AnT
2つ以上の項目で試してください。Visual Studioは、デバッグビルドですぐに例外をスローしました。 –