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())

これがどのように評価されるかを理解すれば、安全な「ノーオペレーション」であることがわかります。所有しているポインタを解放し、nullを解放してから、ポインタを元の値に戻します。

なんでそんなことをしているのかよくわかりません。

于 2013-01-18T06:39:42.017 に答える