イディオムはセオリー通りに書かないとだめ

気づいてしまえば非常につまらないミスなんですが。

void some_class::some_method(int parameter)
{
  int p;
  while ( p = m_pClass->some_enumerator(parameter) < 0 ) {
    do_some_work(p);
  }
}

うんうん、m_pClassの指しているオブジェクトがなにかコレクションを保持していて、some_enumerator()で条件を指定して何かを数え上げるのね。それでもう何もなくなれば負値を返すので、取得できたものについてdo_some_work()で処理をすると。...が、動かない。なにも起こらない。

よく見ればわかりますが、ここでやりたかったことでは、whileの条件式は

  while ((p = m_pClass->some_enumerator(parameter)) < 0) {

と代入演算子側をカッコでくくらないとだめです。一つ上の書き方では、'<'の優先順位の方が上なので、「数え上げるものがある間、pに'1'を代入し続ける」動作になります。

ここでのみそは、どちらの書き方でもループ回数は変わらないところでしょうか。今回、上で言うdo_some_work()が、たまたま'1'だけ渡しても一見何も起こらないだけなので、すぐには気付きませんでした。落ちたり無限ループにでもなれば、さすがにすぐおかしいと思うのでしょうが。