GCC 4.4 / 4.5 unique_ptr не работает для unordered_set / unordered_map - PullRequest
6 голосов
/ 08 сентября 2011

Есть ли место, где я могу это подтвердить?Я не уверен, является ли это проблемой GCC или моего кода.Например, следующий код не компилируется:

#include <unordered_set>
#include <memory>
using namespace std;

int main() {
    unordered_set<unique_ptr<int> > s;
    unique_ptr<int> p(new int(0));
    s.insert(move(p));
    return 0;
}

Сообщение об ошибке слишком велико, и я не хочу помещать его здесь.Версия GCC 4.5.3, флаг компиляции -std = gnu ++ 0x.Также протестировано на 4.4.5.

Ответы [ 3 ]

8 голосов
/ 08 сентября 2011

GCC 4.6.1 принимает ваш код как есть, и я не вижу в этом ничего плохого (то есть тип_значения ассоциативного контейнера должен быть EmplaceInsertable, а std::unique_ptr не препятствует этому).Предположительно это недостаток GCC 4.5.

4 голосов
/ 20 января 2012

Ваш код правильный. Это известная проблема в GCC 4.5. Это было исправлено в 4.6. См. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44436. Это также влияет на заказанные контейнеры (std :: map, std :: set и т. Д.). Вероятно, самый простой обходной путь (с небольшим снижением производительности) будет использовать std :: shared_ptr вместо std :: unique_ptr.

3 голосов
/ 04 октября 2011

Я могу подтвердить, что это проблема с GCC 4.4.5.Попытка вставить unique_ptr в std :: set приводит к длинному сообщению об ошибке компилятора, которое ссылается на тот факт, что какая-то функция в STL пыталась скопировать unique_ptr:

ошибка: удаленная функция [unique_ptrcopy ctor] ... используется здесь [g ++ - v4 / bits / stl_tree.h: 136].

Рассматриваемая функция STL является частью внутренней структуры дерева нескольких классов STL, включая std::задавать.Это также внутри ifdef "__GXX_EXPERIMENTAL_CXX0X__", что, вероятно, означает, что GCC 4.4 официально не поддерживает то, что мы пытаемся сделать.

Если вы не хотите обновляться до GCC 4.6, вы всегда можете перенестиstd :: vector и стратегически проверять и удалять дубликаты в определенных точках вашего кода.

...