3

最近、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 モードでビルドされた実行可能ファイルをリンクすべきではないかということです。

4

1 に答える 1

6

それはOne Definition Ruleに違反していると思います。コードはstd::list、ライブラリが使用しているものとは異なる定義でコンパイルされています。(これは未定義の動作であり、GCC のバグではありません。)

ライブラリを再コンパイル (またはコードを再コンパイル) する必要があります。

于 2012-05-08T12:49:11.687 に答える