Я использую последнюю доступную сборку GCC из репозитория. Я решил использовать его из-за некоторых дополнительных возможностей C ++ 0x. Однако теперь я остановился на том, что должно работать - я хочу добавить новый элемент на карту через r-значение. Упрощенный код, демонстрирующий проблему:
#include
class X
{
public:
X (void) { /* ... */ };
X (const X& x) = delete;
X (X&& x) { /* ... */ };
};
int main (void)
{
std::tr1::unordered_map map;
// using std::tr1::unordered_map::value_type didn't help too
std::pair 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]’
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]’ 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] Реализовать emplace * в ассоциативных и неупорядоченных контейнерах .
Может я что не так делаю? Я хочу убедиться, что это ошибка GCC или libstdc ++, прежде чем сообщать о ней.