はコピー不可能なので、 が使用されない限り、unique_ptr
を にプッシュバックすることはできません。ただし、が を返す関数である場合は、操作が許可されます。以下に例を示します。std::vector
std::move
F
unique_ptr
std::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()
は右辺値です。