2011-01-26 99 views
7

我正在使用來自存儲庫的最新可用GCC構建。我決定使用它,因爲一些額外的C++ 0x功能。然而,現在我堅持一些假設的工作 - 我想添加新的元素來通過r值映射。簡化代碼,這說明問題:R值插入不適用於unordered_map

#include <tr1/unordered_map> 

class X 
{ 
    public: 
     X (void) { /* ... */ }; 
     X (const X& x) = delete; 
     X (X&& x) { /* ... */ }; 
}; 

int main (void) 
{ 
    std::tr1::unordered_map<int, X> map; 

    // using std::tr1::unordered_map<int, X>::value_type didn't help too 
    std::pair<int, X> value (1, X()); 

    map.insert (std::move (value)); 
} 

注意,當一些原始類型像int代碼編譯和工作得很好替代X類。

在我對應於X的生產代碼類中也沒有拷貝構造函數。

錯誤消息是(像所有與模板相關的錯誤)很長且無法讀取,我不確定是否將它放在此處是個好主意。如果你想要錯誤信息,請通知我,所以我會更新這個問題。消息的最後一部分是有趣:

(...) 
/usr/include/c++/trunk/ext/new_allocator.h:106:9: error: use of deleted function ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int, _T2 = X, std::pair<_T1, _T2> = std::pair<const int, X>]’ 
In file included from /usr/include/c++/trunk/utility:71:0, 
       from /usr/include/c++/trunk/tr1/unordered_map:34, 
       from kod.cpp:1: 
/usr/include/c++/trunk/bits/stl_pair.h:110:17: error: ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int, _T2 = X, std::pair<_T1, _T2> = std::pair<const int, X>]’ is implicitly deleted because the default definition would be ill-formed: 
/usr/include/c++/trunk/bits/stl_pair.h:110:17: error: use of deleted function ‘X::X(const X&)’ 

而且這應該工作,因爲類似的錯誤已經被固定[C++0x] Implement emplace* in associative and unordered containers

也許我做錯了什麼?在報告之前,我想確定這是GCC或libstdC++的錯誤。

+0

缺少R-Value兼容'插入'方法現在可在未發佈的GCC 4.6.0中使用。 – Goofy 2011-02-06 19:21:41

回答

5

除了使用tr1外,您的代碼看起來正確。 tr1合格的東西不知道右值引用或移動語義。

我把你的代碼從頭文件和命名空間限定符中移除了tr1,並且使用g ++ -4.4和libC++(http://libcxx.llvm.org/)成功編譯了你的代碼。嘗試刪除tr1。

+0

作品,,前段時間很奇怪編譯器強制我在使用TR1的某些功能時強迫我使用「tr1」命名空間...... – Goofy 2011-01-26 21:17:20

0

value_typeunordered_map不是std::pair<int, X>。它是std::pair<const int, X>。也許如果你使用這種類型的value它會更好。

decltype(map)::value_type value(1, X()); 
map.insert(std::move(value)); 

雖然我不完全明白爲什麼你的代碼不應該按原樣工作。