リポジトリから入手可能な最新の GCC ビルドを使用しています。追加の C++0x 機能があるため、これを使用することにしました。しかし、今はうまくいくと思われるものに固執しました-r値を介してマップする新しい要素を追加したいです。問題を示す簡略化されたコード:
#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
クラスをコードのようなプリミティブ型に置き換えるとint
、コンパイルして問題なく動作することに注意してください。
私の製品コードでは、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++ のバグであることを確認したいと思います。