GCC 4.9的unordered_set和std :: move

时间:2014-05-22 21:34:16

标签: c++ gcc move-semantics gcc4.9

当在GCC 4.9上移动unordered_set,然后重新使用移动的对象时,我在添加它时会得到除零。

我的理解(来自http://en.cppreference.com/w/cpp/utility/move)是可以使用移动的对象,前提是它没有违反任何先决条件。在移动的集合上调用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实现中的问题,还是我理解违反移动对象的前提条件意味着什么?

2 个答案:

答案 0 :(得分:9)

这是PR 61143。它已针对gcc-4.10修复,修复程序已及时向后移植4.9.1。

答案 1 :(得分:3)

Marc Glisse已经向您推荐了GCC错误,但回答了您的问题:

  

这是一个问题......在我理解违反移动对象的前提条件意味着什么?

不,不是,你的理解是正确的。让问题中的代码工作并不仅仅是GCC扩展,您的程序完全有效。标准库中定义的类型的移动对象应该保持可用。您对其状态一无所知,但是,作为示例,任何容器都是空的,或者是非空的,因此移动的容器也可以是空的也可以是非空的。其中哪些是未指定的,但您的程序可以检查,标准库实现必须适合您的程序检查结果。