for
ループ内の不思議な反復子の問題を追跡しようとしています。イテレーターでエラーが発生しますoperator!=
。これは通常、比較されるイテレーターが同じコンテナーに属していないことを意味します。ライブラリの Microsoft の実装をトレースすると、このテストが true の場合にoperator!=
呼び出されます。operator==
bool operator==(const _Myiter& _Right) const
{ // test for iterator equality
#if _ITERATOR_DEBUG_LEVEL == 2
if (this->_Getcont() == 0
|| this->_Getcont() != _Right._Getcont())
{ // report error
_DEBUG_ERROR("list iterators incompatible");
!=
より多くの情報を取得するために、for
ループ内のmy を置き換えるために、この小さな関数を作成しました。
template<typename iter>
bool bang_equal(const iter & left, const iter & right)
{
static int count = 0;
auto p1 = left._Getcont();
auto p2 = right._Getcont();
ATLTRACE("Iterator comparison left _Getcont()=%p right _Getcont()=%p %d\n", p1, p2, ++count);
MemoryBarrier();
bool b = left != right;
MemoryBarrier();
auto p3 = left._Getcont();
auto p4 = right._Getcont();
ATLTRACE(" left _Getcont()=%p right _Getcont()=%p %d\n", p3, p4, ++count);
return b;
}
ここが興味深いところです。式でまだエラーが発生しleft != right
、デバッガーはそこで停止しますが、最初の式ATLTRACE
がスキップされたか、2 番目の式が事前に実行されました! デバッガーの出力には両方の行がありcount
、デバッガーによって表示される as の値は、出力の最後の行と一致します。
Iterator comparison left _Getcont()=07D0B2C8 right _Getcont()=07D0B2C8 2984
left _Getcont()=07D0B2C8 right _Getcont()=07D0B2C8 2985
Myprog.exe has triggered a breakpoint.
逆アセンブリ ウィンドウを見ると、予想される順序で命令が表示されます。私は困惑しています。何が起こっているのでしょうか?