ホームページ >バックエンド開発 >C++ >C で一意のポインタをベクトルに直接プッシュできないのはなぜですか?

C で一意のポインタをベクトルに直接プッシュできないのはなぜですか?

DDD
DDDオリジナル
2024-12-29 02:35:091000ブラウズ

Why Can't I Directly Push a Unique Pointer into a Vector in C  ?

問題の理解: ベクトルへの一意のポインタの挿入

提供されたコードは、一意のポインタをベクトルにプッシュしようとします。ただし、エラー メッセージには、コンパイル失敗の背後にある理由が示されています。

error: deleted function 'std::unique_ptr<int>::unique_ptr(const std::unique_ptr<int>&)'

このエラーは、一意のポインターのコピーが許可されていないために発生します。

一意のポインターの性質

一意のポインターは、その名前が示すように、動的メモリの場所の排他的所有権を確立します。これにより、保持されたポインターの所有権を持つ一意のポインター コンテナーが 1 つだけ存在することが保証されます。その結果、一意のポインターのコピーを作成することは許可されなくなります。コピーすると、2 つの一意のポインタが同じ動的メモリの所有権を主張することになり、一意の所有権の固有のルールに違反します。

代わりに、一意のポインタの所有権を別のコンテナまたは関数に転送する必要がある場合、移動はC のセマンティクスが登場します。

問題の解決: Move セマンティクスの利用

コンパイル エラーと問題の解決策一意のポインタをベクトルにプッシュすることは、移動セマンティクスを活用することにあります。 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。