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

时间:2012-05-08 12:45:11

标签: c++ list gcc c++11 std

在使用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模式构建的可执行文件?

1 个答案:

答案 0 :(得分:6)

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

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