GCC 4.9的unordered_set和std :: move

Mat*_*t G 5 c++ gcc move-semantics gcc4.9

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

我的理解(来自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();
}?
Run Code Online (Sandbox Code Playgroud)

这段代码在GCC4.7上运行正常 - 这是GCC4.9 unordered_set实现中的一个问题,还是我理解违反移动对象的前提条件意味着什么?

Mar*_*sse 9

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