[英]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.