GCC 4.9 的 unordered_set 和 std::move
GCC 4.9's unordered_set and std::move
当在GCC 4.9上移动unordered_set
,然后重用从移动对象时,当我添加它时,我得到一个除零。
我的理解(来自http://en.cppreference.com/w/cpp/utility/move)是,只要不违反其先决条件,就可以使用从移动对象。在move -from集合上调用clear()
是可以的(这在前提条件的上下文中是有意义的),但是我不清楚添加新元素是否违反了任何前提条件。
示例代码:
#include <unordered_set>
using namespace std;
void foo(unordered_set<int> &&a) {
unordered_set<int> copy = std::move(a);
}
void test() {
unordered_set<int> a;
for (int i = 0; i < 12; ++i) a.insert(i);
foo(std::move(a));
a.clear();
a.insert(34); // divide by zero here
}
int main() {
test();
}
这段代码在GCC4.7上工作得很好-这是GCC4.9的unordered_set
实现中的问题,还是我对违反从对象移动的前提条件的理解?
这是pr61143。
Marc Glisse已经向您介绍了GCC错误,但是回答您的问题:
不,它不是,你的理解是正确的。使问题中的代码工作不仅仅是一个GCC扩展,您的程序是完全有效的。标准库中定义的类型的移出对象应该保持可用。您不知道它的状态,但是,作为一个例子,任何容器都是空的,或者是非空的,所以一个移动的容器也可能是空的或者是非空的。其中哪一个是未指定的,但您的程序可以检查,并且标准库实现必须对程序的检查结果表现得适当。这是一个问题…在我的理解中,违反了移动对象的前提条件意味着什么?
相关文章:
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 修改"std::set"中用户定义类型的值
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- 我从 std::set 得到const_iterator而不是迭代器
- 为什么 std:set(带有单个冒号)可以编译?
- 遍历 std::set 中包含的所有三重不同值?
- 插入 std::set 作为 std::map 的键
- 如何在 c++ 中使用默认值将 std::set 转换为 std::map
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- 如何从 std::set 绘制 n 个元素的样本
- 为什么 std::set 容器使用的内存比其数据大小多得多?