提供されたコードは、一意のポインタをベクトルにプッシュしようとします。ただし、エラー メッセージには、コンパイル失敗の背後にある理由が示されています。
error: deleted function 'std::unique_ptr<int>::unique_ptr(const std::unique_ptr<int>&)'
このエラーは、一意のポインターのコピーが許可されていないために発生します。
一意のポインターは、その名前が示すように、動的メモリの場所の排他的所有権を確立します。これにより、保持されたポインターの所有権を持つ一意のポインター コンテナーが 1 つだけ存在することが保証されます。その結果、一意のポインターのコピーを作成することは許可されなくなります。コピーすると、2 つの一意のポインタが同じ動的メモリの所有権を主張することになり、一意の所有権の固有のルールに違反します。
代わりに、一意のポインタの所有権を別のコンテナまたは関数に転送する必要がある場合、移動はC のセマンティクスが登場します。
コンパイル エラーと問題の解決策一意のポインタをベクトルにプッシュすることは、移動セマンティクスを活用することにあります。 std::move 関数を使用して実装された移動セマンティクスは、コピーを作成せずに一意のポインターの所有権を譲渡します。
このシナリオでは、修正されたコード スニペットは次のようになります:
int main() { std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(new int(x)); // Allocate the object dynamically vec.push_back(std::move(ptr2x)); // Transfer ownership with move semantics return 0; }
std::move を使用すると、ptr2x の所有権が vec に転送され、ptr2x には nullptr が残ります。
以上がC で一意のポインタをベクトルに直接プッシュできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。