Я вижу некоторый код, который использует unique_ptr
в некоторых странных отношениях, я не уверен, что это даже законно, хотя кажется, что он хорошо компилируется на g ++ с -std=c++0x
#include <memory>
#include <boost/unordered_map.hpp>
typedef std::unique_ptr< std::string > str_ptr_t;
typedef boost::unordered_map< int , str_ptr_t > map_t;
str_ptr_t& get_ptr_value(map_t& map, int key)
{
return map[key];
};
int main()
{
map_t map;
str_ptr_t& ref_to_value_of_0 = get_ptr_value(map, 0);
map[0] = std::move(ref_to_value_of_0);
};
Вкратце, тип значения карты unique_ptr< std::string >
, Я инициализирую ссылку на значение ключа = 0. Затем я перехожу к перемещению содержимого этой ссылки к тому же значению экземпляра, поэтому в основном unique_ptr перемещается на себя. Кажется, что для того, чтобы избежать создания многих экземпляров указанного объекта, предпринимается попытка повторно использовать существующий экземпляр записи, если он уже существует, а затем добавить его снова. На самом деле задание скрыто внутри store
интерфейс, и ссылка возвращается из get
интерфейс, но общая последовательность может быть обобщена в коде, который я показываю выше
Помимо того, что это немного странно, это правильное использование unique_ptr
?
Назначение перемещения определяется в терминах сброса и выпуска, и поэтому оно по сути делает это:
ref_to_value_of_0.reset(ref_to_value_of_0.release())
Если вы поймете, как это оценивается, вы обнаружите, что это безопасное «бездействие». Он освобождает собственный указатель, освобождает нулевое значение, а затем устанавливает свой указатель обратно в исходное значение.
Я не очень понимаю, почему вы это делаете, хотя.
Других решений пока нет …