我看到一些代码以某些奇怪的方式使用unique_ptr
,我不确定它是否合法,尽管它似乎可以在{+ 1}}
-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);
};
。我初始化对key = 0的值的引用。然后我继续将该引用的内容移动到相同的实例值,所以基本上unique_ptr被移动到自身。这似乎是为了避免创建指向对象的许多实例,尝试重用现有的条目实例(如果已存在),然后再次添加它。实际上,赋值隐藏在unique_ptr< std::string >
接口中,并且引用从store
接口返回,但整个序列可以在上面显示的代码中汇总
除了有点奇怪之外,这是get
的有效用法吗?
答案 0 :(得分:4)
移动分配是根据重置和释放来定义的,因此它基本上是这样做的:
ref_to_value_of_0.reset(ref_to_value_of_0.release())
如果你弄清楚如何评估它,你会发现它是一个安全的“无操作”。它释放拥有的指针,释放null,然后将其指针设置回原始值。
我真的不明白为什么你这样做。