最近、libxml++ (libxml2 の C++ ラッパー) を使用しているときに、非常に興味深い矛盾に遭遇しました。
ライブラリは、デフォルトの STL リスト コンテナ ( std::list<xmlpp::Node*>
) を使用してノード リストを返します。デフォルトのリポジトリからインストールされるため、C++03 モードでビルドされているようです (ただし、C++11 で作業しています)。
ここでの注意点は、C++11 がstd::list::size()
動作方法を変更したことです。
C++03 では O(n) で、std::distance(begin(), end())
毎回呼び出していましたが、事前に計算された値を返すようになりました。
コードは次のとおりです。
/** Returns the number of elements in the %list. */
size_type
size() const _GLIBCXX_NOEXCEPT
{
#ifdef __GXX_EXPERIMENTAL_CXX0X__
return this->_M_impl._M_size;
#else
return std::distance(begin(), end());
#endif
}
図書館からそのようなリストを受け取り、それを呼び出すと、物事が起こり始めますsize()
。そこで、140734320138496 のような値を読み取りました。これは、初期化されていないカウンターを明確に示しています。元のリストにはカウンターがまったくありませんでした。もちろん、
手動で呼び出すこともできます。std::distance (list.begin(), list.end())
問題は、これは GCC/libstdc++ のバグと見なすことができるか、それとも異なる GCC モードでビルドされた実行可能ファイルをリンクすべきではないかということです。