Карта 2 уникальных_птр

У меня есть пара вопросов об использовании unique_ptr в контейнере. Вот что я пытаюсь сделать:

class Stuff
{
public: 
    std::map<std::unique_ptr<int>, std::unique_ptr<int> > GetInfo() {return m_mapInfo;}

    // Is this bad??
    std::map<std::unique_ptr<int>, std::unique_ptr<int> > MoveInfo() {return std::move(m_mapInfo);}

private:    
    std::map<std::unique_ptr<int>, unique_ptr<int> > m_mapInfo;
};

Это не компилируется. Это дает мне ошибку C2248. Я использую VS2012.

Сейчас я не пользуюсь unique_ptrс ints; они на самом деле unique_ptrs, чтобы абстрагировать базовые классы, но я хотел устранить любые проблемы, связанные с тем, была ли ошибка связана с моими конструкторами копирования / перемещения / операторами присваивания.

Может кто-нибудь объяснить ошибку, и как ее исправить?

Во-вторых, это мой MoveInfo() плохая практика? Он может быть вызван только один раз для каждого объекта Stuff, так как член карты будет пустым после него, да?

1 ответ

unique_ptr предназначены для получения и сохранения владения указателем, т. е. быть уникальными. Вот почему они не копируются.

Возврат копии на карту будет означать дублирование (копирование) всего ее содержимого, что невозможно из-за unique_ptr. Вот почему вы получаете сообщение C2248.

Либо верните ссылку на карту, либо рассмотрите возможность использования shared_ptr (чтобы несколько карт могли иметь ссылку на один и тот же указатель).

Другие вопросы по тегам