unique_ptr的奇怪用法

时间:2013-01-18 06:32:14

标签: c++ c++11 unique-ptr return-by-reference

我看到一些代码以某些奇怪的方式使用unique_ptr,我不确定它是否合法,尽管它似乎可以在{+ 1}}

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

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

1 个答案:

答案 0 :(得分:4)

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

ref_to_value_of_0.reset(ref_to_value_of_0.release())

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

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