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

Bug in libstdc++ regarding std::list assignment?

本文关键字:list 赋值 错误 std libstdc++      更新时间:2023-10-16

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

我认为这违反了一个定义规则。编译代码时std::list的定义与库使用的定义不同。(这是未定义的行为,不是 GCC 错误。

您应该重新编译

库(或重新编译代码)。