いくつかの奇妙な方法で使用するコードを見ていますが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
ですか?