簡體   English   中英

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 )是可以使用移動的對象,前提是它沒有違反任何先決條件。 在移動的集合上調用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實現中的問題,還是我理解違反移動對象的前提條件意味着什么?

這是PR 61143 它已針對gcc-4.10進行了修復,修復程序已及時向后移植4.9.1。

Marc Glisse已經向您介紹了GCC錯誤,但回答了您的問題:

這是一個問題......在我理解違反移動對象的前提條件意味着什么?

不,不是,你的理解是正確的。 使問題中的代碼工作不僅僅是GCC擴展,您的程序完全有效。 標准庫中定義的類型的移動對象應該保持可用。 您對其狀態一無所知,但是,作為示例,任何容器都是空的,或者是非空的,因此移動的容器也可以是空的也可以是非空的。 其中哪些是未指定的,但您的程序可以檢查,標准庫實現必須適合您的程序檢查結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM