ホームページ > バックエンド開発 > C++ > 「unique_ptr」を「vector」にプッシュするには「std::move」が必要なのはなぜですか?

「unique_ptr」を「vector」にプッシュするには「std::move」が必要なのはなぜですか?

DDD
リリース: 2025-01-04 19:28:44
オリジナル
711 人が閲覧しました

Why does pushing a `unique_ptr` into a `vector` require `std::move`?

エラーの理解

次のプログラムについて考えてみましょう:

#include <memory>
#include <vector>

int main() {
  std::vector<std::unique_ptr<int>> vec;

  int x(1);
  std::unique_ptr<int> ptr2x(&x);
  vec.push_back(ptr2x); // Error occurs here
}
ログイン後にコピー

この一見無害なコードは、 unique_ptr をプッシュしようとしています。ベクトルに変換します。ただし、コンパイルは次のエラーで失敗します。

error: deleted function 'std::unique_ptr<int>::unique_ptr(const std::unique_ptr<int>&)'
ログイン後にコピー

unique_ptr の性質

unique_ptr は、管理に使用される C 標準ライブラリの基本的な部分です。動的に割り当てられたオブジェクトの存続期間。これにより、カプセル化されたポインタがコピーできないことが保証されます。これは、管理オブジェクトの所有権が unique_ptr コンテナに排他的であることを意味します。

問題

プログラムが unique_ptr のコピーを unique_ptr コンテナにプッシュしようとするため、エラーが発生します。ベクトル。ただし、前述したように、unique_ptrs はコピーできません。代わりに、それらは移動することしかできません。

解決策

したがって、問題を解決するには、std::move 関数を使用して unique_ptr の所有権を譲渡する必要があります。元の変数からベクトルへ。修正されたコードは次のようになります。

#include <memory>
#include <vector>

int main() {
  std::vector<std::unique_ptr<int>> vec;

  int x(1);
  std::unique_ptr<int> ptr2x(&x);
  vec.push_back(std::move(ptr2x)); // Use std::move to transfer ownership
}
ログイン後にコピー

これで、コンパイラーはエラーなしでプログラムを正常にコンパイルして実行できるようになります。

追加の考慮事項

コード内での unique_ptr の使用は間違っていることに注意することが重要です。 unique_ptr は、動的に割り当てられたオブジェクトを管理することを目的としています。コード内のポインタは、関数が返されるときに破棄されるローカル変数を指しています。これを修正するには、コードでオブジェクトを動的に割り当てる必要があります:

#include <memory>
#include <vector>

int main() {
  std::vector<std::unique_ptr<int>> vec;

  std::unique_ptr<int> ptr(new int(1)); // Dynamically allocate the object
  vec.push_back(std::move(ptr));
}
ログイン後にコピー

または、std::make_unique 関数を使用して unique_ptr を作成し、オブジェクトを 1 行で割り当てることもできます:

#include <memory>
#include <vector>

int main() {
  std::vector<std::unique_ptr<int>> vec;

  vec.push_back(std::make_unique<int>(1));
}
ログイン後にコピー

以上が「unique_ptr」を「vector」にプッシュするには「std::move」が必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート