Вставка R-значения не работает для unordered_map

Я использую последнюю доступную сборку 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 ++, прежде чем сообщать о ней.

7
задан Marc Mutz - mmutz 1 May 2011 в 08:01
поделиться