リポジトリから最新のGCCビルドを使用しています。私はそれを使用することを決めたのは、C++ 0xの追加の機能がいくつかあるからです。しかし、今私は何か動作すると思う何かにこだわりました - 私はr値を介してマップする新しい要素を追加したいです。問題を示し簡体コード:int
コードコンパイルし、うまく動作するようないくつかのプリミティブ型でX
クラスを置き換えること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));
}
お知らせ。
私の生産コードクラスでは、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互換の 'insert'メソッドが、リリースされていないGCC 4.6.0で利用できるようになりました。 – Goofy