我看到一些以某些怪异方式使用unique_ptr的代码,尽管它在使用-std=c++0x的g ++上似乎可以正常编译,但我不确定它是否合法

#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 >。我初始化了对key = 0值的引用。然后,我继续将该引用的内容移动到相同的实例值,因此,基本上unique_ptr被移动到其自身上。这似乎是为了避免创建指向对象的许多实例,如果已有的入口实例已经存在,则尝试重新使用它,然后再次添加它。实际上,赋值隐藏在store接口内部,而引用是从get接口返回的,但是整体序列可以在上面显示的代码中总结

除了有点奇怪之外,unique_ptr的这种有效用法吗?

最佳答案

移动分配是根据重置和释放定义的,因此它实际上是在这样做:

ref_to_value_of_0.reset(ref_to_value_of_0.release())


如果计算出评估结果的方式,您会发现它是安全的“禁止操作”。它释放拥有的指针,释放空值,然后将其指针设置回原始值。

我真的不明白你为什么这么做。

08-16 07:14