覚え間違いをナチュラルに発言してしまうと怖い

ムーブコンストラクタを何故かリムーブ*1といってしまうのが私です。

それはともかく、unique_ptrでムーブコンストラクタが上手く働かないなんでとか言ってたら単純にムーブしたunique_ptrを持つオブジェクトもムーブしなきゃいけないからでした。

class hoge
{
public:
    hoge( std::unique_ptr< int >&& ptr ) : Ptr_( std::move( ptr ) ) {};
    hoge( hoge&& other ) : Ptr_( std::move( other.Ptr_ ) ) {};

    void func() const { std::cout << *Ptr_ << std::endl; };

private:
    std::unique_ptr< int > Ptr_;
};

// hoge を持っている
class fuga
{
public:
    fuga( hoge&& Hoge ) : Hoge_( std::move( Hoge ) ) {};

    void func() const { Hoge_.func(); };

private:
    hoge Hoge_;
};

std::unique_ptr< int > dat( new int(5) );
fuga f( hoge( std::move( dat ) ) );

f.func();    //#=> 5

なんかややこしいな。

hogeがunique_ptrをもっていて、そのhogeをfugaが持っているので、正しく転送するためにこんなコードに。

std::move( hoge( std::move( fuga() ) ) ) と hoge( std::move( fuga() ) ) が等価だなんてこともやってて知りました。

理解が不十分なので、もうちょっと頑張ってみます。後リムーブとか言うクセも直したい。

*1:これ書いてるときも間違えました