Карта 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
с int
s; они на самом деле unique_ptr
s, чтобы абстрагировать базовые классы, но я хотел устранить любые проблемы, связанные с тем, была ли ошибка связана с моими конструкторами копирования / перемещения / операторами присваивания.
Может кто-нибудь объяснить ошибку, и как ее исправить?
Во-вторых, это мой MoveInfo()
плохая практика? Он может быть вызван только один раз для каждого объекта Stuff, так как член карты будет пустым после него, да?
1 ответ
unique_ptr
предназначены для получения и сохранения владения указателем, т. е. быть уникальными. Вот почему они не копируются.
Возврат копии на карту будет означать дублирование (копирование) всего ее содержимого, что невозможно из-за unique_ptr. Вот почему вы получаете сообщение C2248.
Либо верните ссылку на карту, либо рассмотрите возможность использования shared_ptr
(чтобы несколько карт могли иметь ссылку на один и тот же указатель).