0

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

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

4

1 回答 1

4

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

ref_to_value_of_0.reset(ref_to_value_of_0.release())

如果你弄清楚这是如何评估的,你会发现它是一个安全的“无操作”。它释放拥有的指针,释放空值,然后将其指针设置回原始值。

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

于 2013-01-18T06:39:42.017 回答