std::unique_ptr を std::vector にプッシュバックしてもコンパイラが失敗しない 質問する

std::unique_ptr を std::vector にプッシュバックしてもコンパイラが失敗しない 質問する

はコピー不可能なので、 が使用されない限り、unique_ptrを にプッシュバックすることはできません。ただし、が を返す関数である場合は、操作が許可されます。以下に例を示します。std::vectorstd::moveFunique_ptrstd::vector::push_back(F())

#include <iostream>
#include <vector>
#include <memory>

class A {
  public:
    int f() { return _f + 10; }

  private:
    int _f = 20;
};

std::unique_ptr<A> create() { return std::unique_ptr<A>(new A); }


int main() {
  std::unique_ptr<A> p1(new A());

  std::vector< std::unique_ptr<A> > v;

  v.push_back(p1); // (1) This fails, should use std::move

  v.push_back(create()); // (2) This doesn't fail, should use std::move?

  return 0;
}

(2)許可されているように見えますが、(1)そうではありません。これは、返される値が何らかの形で暗黙的に移動されるためでしょうか?

では(2)、実際に を使用する必要があるのでしょうかstd::move?

ベストアンサー1

std::move(X)本質的には、「ここでは、X を一時的なオブジェクトとして扱う」という意味です。

create()std::unique_ptr<A>そもそも一時的なものを返すので、move不要です。


もっと詳しく知りたい方は、価値カテゴリーコンパイラは値カテゴリを使用して、式が一時オブジェクトを参照しているかどうか ("rvalue") を判断します ("lvalue")。

p1は左辺値であり、create()は右辺値です。

おすすめ記事