一意のポインタのベクトル: Push_back が拒否される理由とその克服方法
C では、一意のポインタを格納しようとすると障害が発生しますベクトル内のポインター。ベクター コンテナはコピーを許可する要素を期待しますが、一意のポインタは一意の所有権の原則に厳密に準拠します。
次のスニペットを考えてみましょう:
std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(&x); vec.push_back(ptr2x); // Compiler error: attempt to copy unique pointer
このエラーは、排他性を確保するための unique_ptr の設計に起因します。所有。 unique_ptr をコピーすると、この基本的なプロパティに違反し、その中心的な目的が損なわれます。
ジレンマを解決するための移動
この問題を解決するには、「move」操作を利用する必要があります。コピーするのではなく。移動操作は、あるコンテナーから別のコンテナーに所有権を移し、重複がないようにします。
vec.push_back(std::move(ptr2x));
この変更により、コードは unique_ptr をベクターに正常に挿入し、排他的所有権を維持します。
注意事項
ポインターを管理するために unique_ptr を使用することに注意することが重要です。 「x」のようなローカル変数は推奨されません。ローカル変数は、ブロック終了時に自動的に処理されます (たとえば、この場合は関数が返される)。代わりに、オブジェクトを動的に割り当てる必要があります。
std::unique_ptr<int> ptr(new int(1));
C 14 では、make_unique:
std::make_unique<int>(5);
以上が一意のポインタをベクトルに「プッシュバック」できない理由とその修正方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。