我看到一些以某些怪异方式使用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())
如果计算出评估结果的方式,您会发现它是安全的“禁止操作”。它释放拥有的指针,释放空值,然后将其指针设置回原始值。
我真的不明白你为什么这么做。