探求編
困ったときはコード読め、と昔の偉い人が言ったそうです。嘘。
どう実装されているのか、コンパイラのソースを見てみました。
# array.c int #if _WIN32 __cdecl #endif Array_sort_compare(const void *x, const void *y) { Object *ox = *(Object **)x; Object *oy = *(Object **)y; return ox->compare(oy); } void Array::sort() { if (dim) { qsort(data, dim, sizeof(Object *), Array_sort_compare); } }
# root.c int Object::compare(Object *obj) { return this - obj; }
Cの標準ライブラリのqsortにArray_sort_compareが渡され、Array_sort_compareはObject::compareを呼び出してその返値を返すのですが、Object::compareが「return this - obj;」というがっかりな代物なので、opCmpをオーバーライドしても無意味。普通に普通のCのqsortでしかない…
thisとobjはObjectのポインタらしい、ということはポインタ演算なんですが、後から代入されたオブジェクトのほうがアドレス大きいらしいので、代入された順に整列されてしまう…であってるんだろうか。謎。
自分でsortぐらい書けってことなんだろうか…がっかり。