次のコードがあるとします。
class B { /* */ };
class A {
vector<B*> vb;
public:
void add(B* b) { vb.push_back(b); }
};
int main() {
A a;
B* b(new B());
a.add(b);
}
この場合、すべての生ポインタB*
を を通じて処理できるとしますunique_ptr<B>
。
驚いたことに、 を使用してこのコードを変換する方法を見つけることができませんでしたunique_ptr
。数回試行した後、コンパイルできる次のコードを思いつきました。
class A {
vector<unique_ptr<B>> vb;
public:
void add(unique_ptr<B> b) { vb.push_back(move(b)); }
};
int main() {
A a;
unique_ptr<B> b(new B());
a.add(move(b));
}
だから私の簡単な質問:これはそれを行う方法ですか、特に、それmove(b)
を行う唯一の方法ですか?(右辺値参照について考えていましたが、完全には理解していません。)
unique_ptr
そして、私が見つけることができなかった移動セマンティクスなどの完全な説明へのリンクがある場合は、遠慮なく共有してください。
編集http://thbecker.net/articles/rvalue_references/section_01.htmlによると、私のコードは問題ないようです。
実際、 std::move は単なるシンタックス シュガーです。クラス X のオブジェクト x を使用move(x)
すると、次のようになります。
static_cast <X&&>(x)
右辺値参照にキャストするため、これら 2 つの移動関数が必要です。
- 関数「add」が値渡しするのを防ぎます
push_back
B のデフォルトの移動コンストラクタを使用します
どうやら、 「追加」関数を参照渡し(通常の左辺値参照)に変更std::move
した場合、2番目は必要ありません。main()
このすべての確認をお願いしたいのですが...