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

标签 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
  }

当我从图书馆收到这样一份 list 并调用 size() 时,事情就开始发生了。在上面。在那里我读到像 140734320138496 这样的值,它清楚地表明一个未初始化的计数器:在原始列表中完全没有计数器。
手动调用std::distance (list.begin(), list.end())当然有效。

问题是 - 这可以被视为 GCC/libstdc++ 中的错误,还是我不应该链接以不同 GCC 模式构建的可执行文件?

最佳答案

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

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

关于c++ - libstdc++ 中关于 std::list 赋值的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10498887/

相关文章:

.net - 从 ActiveX 控件使用 CWinFormControl

c++ - C4150 : Deletion of pointer to incomplete type and PIMPL idiom

c++ - Qt disconnectNotify() 未在接收器对象销毁时调用

c - MinGW gcc 什么也不做

C++ 时间测量看起来太慢

python - 比较两个列表列表,每个元素列表的大小不相等

python - 如何在python中一次性找到链表的中间元素?

javascript - 用嵌套列表值包装嵌套字典

c++ - 主要开源项目使用哪些 GCcflags来控制 C 和 C++ 中的未定义行为?

c++ - native 代码 : cannot use typeid with -fno-rtti