【问题标题】:Bug in libstdc++ regarding std::list assignment?libstdc++ 中关于 std::list 分配的错误?
【发布时间】:2012-05-16 22:52:12
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多