提供されたコードは、組み込み型の整数 num が Func 関数内で変更される予期しない動作を示しています。ただし、std::move を使用して r 値参照として渡されます。この動作は、std::move が所有権とリソースを転送するという一般的な理解に矛盾します。
移動セマンティクスとは、あるオブジェクトから別のオブジェクトへの所有権とリソースの転送を指します。このコンテキストでは、リソースとは、オブジェクトに属するデータ値または割り当てられたメモリです。
整数などの組み込み型は、それ自体がリソースを表します。所有。したがって、リソースの所有権を譲渡することはほとんど意味がありません。代わりに、オブジェクトへの参照を渡すだけで、変更を元のオブジェクトに反映できるようになります。
std::move は、実際にオブジェクトを移動するわけではありません。 。その目的は、l 値参照 (定義された位置を持つオブジェクトへの参照) を x 値参照 (有効期限が切れたオブジェクトへの参照) に変換することです。この変換により、参照を受信関数内の右辺値参照にバインドできるようになります。
組み込み型オブジェクトで std::move を呼び出した後、参照が渡されました。関数はまだ元のオブジェクトを参照しています。オブジェクトに加えられた変更はすべて、元のオブジェクトに反映されます。
カスタムの移動セマンティクスを定義できるユーザー定義型とは異なり、組み込み型にはそのような動作はありません。 std::move は、組み込み型の移動コンストラクターや代入演算子を呼び出しません。代わりに、バインディングの目的でそれらを右辺値参照にキャストするだけです。この動作は C 標準によって明確に定義されており、指定されたコード例の num の予期しない変更を説明しています。
以上が組み込み型が移動セマンティクスを示さないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。