Qtでハマったこと

(8/17追記)この記事は間違っているような気がするので真に受けないで下さい。 手元で試しても再現しないし、 ソースを読むと QList::iterator::operator< はちゃんと要素の順序を考慮しているように見える。

先日、某所のヘルプのため Qt (C++向けのクロスプラットフォームGUIツールキット)でほんの少しだけプログラムを書く機会があったのだけど、そこで見事にハマった話を書く.
Qtはリストやvector等の標準的なコンテナの実装を提供している.これらはSTLスタイルのイテレータにより走査できる. 今は手元にQtの環境がないためうろ覚えだが、例えば次のコードはコンパイルが(きっと)通る:

#include<QList>
#include <iostream>

int main(void) {
  QList<int> l;
  l.push_back(1);
  l.push_back(3);
  l.push_back(5);
  for(QList<int>::iterator it=l.begin(); it < l.end(); it++) {
   std::cout << *it << std::endl;
  }
}

上のプログラムはリンクリストQList を走査して標準出力に出力するつもりで書いた.
日常的なC++使いの皆さんはすぐに誤りを発見できると思うが(残念ながら私はそれほどではなかった),上の for ループの終了条件 it

なんでやねん

なんでリンクリストのイテレータに operator < があるねん. STLにはそんなもんないぞ. そりゃ,!= で比較するのは常識かもしれんけど,うっかりミスで足をぶち抜く仕組みってやっぱりどうなのよ.

(去年の同じプロジェクトのヘルプでも同じミスで時間をつぶしたので、私も悪いといえば悪い.)

追記

ちょっとマニュアル読んだけど QList はリンクリストではないっぽい. なにこれ.