libstdc++ 中关于 std::list 赋值的错误
Bug in libstdc++ regarding std::list assignment?
我最近在使用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 错误。
库(或重新编译代码)。
相关文章:
- 为"adjacent"变量赋值时出现问题
- C++中的赋值发生,尽管右侧出现异常
- 用C++中的sscanf赋值
- 为std::string的某个索引赋值
- 重载Singly Linked List中的赋值运算符
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- gtest_使用setargpointee在函数中赋值
- 非常量变量只读位置的赋值
- 使用赋值运算符重载从类中返回jobject
- C++数据文件、数组和计算赋值
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 全局作用域中函数指针的赋值
- 错误:在为指针赋值时,void值没有被忽略
- 标准库类型的赋值运算符的引用限定符
- 关于 c++ 函数中指针赋值的简单问题
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- cin >> int 给定一个字符串将 int 赋值为 0
- libstdc++ 中关于 std::list 赋值的错误
- 对指向std::list类型的共享指针赋值不起作用