我正在使用來自存儲庫的最新可用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++的錯誤。
缺少R-Value兼容'插入'方法現在可在未發佈的GCC 4.6.0中使用。 – Goofy 2011-02-06 19:21:41