关于std :: list赋值的libstdc ++中的错误?

int*_*lfx 3 c++ gcc list std c++11

在使用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
  }
Run Code Online (Sandbox Code Playgroud)

当我从图书馆收到这样的清单并打电话时,情况就开始发生size()了.在那里我读取了像140734320138496这样的值,它清楚地表明了一个未初始化的计数器:在原始列表中完全没有计数器.当然,
手动呼叫std::distance (list.begin(), list.end())确实有效.

问题是 - 这可以被认为是GCC/libstdc ++中的一个错误,或者我永远不应该链接不同GCC模式中构建的可执行文件?

Mat*_*Mat 6

我认为这违反了One Definition Rule.您的代码使用与std::list库所使用的定义不同的定义进行编译.(这是未定义的行为,而不是GCC错误.)

您应该重新编译库(或重新编译代码).