Reinterpret_cast および Trivial Default Constructors: A Journey into Unknown Behavior
cppreference ドキュメントでは、かつて、cppreference ドキュメントでは、単純なデフォルトで構築可能なオブジェクトは次の方法で作成できると主張していました。適切に配置されたメモリ上で reinterpret_cast を実行します。ただし、このアサーションはその後、そのようなオブジェクトを明示的に初期化するために、placement-new を使用する必要性を強調するために改訂されました。
ライフタイムの謎
If reinterpret_cast がオブジェクトを作成した場合、私たちは彼らの生涯に関するジレンマに遭遇するでしょう。鋳造操作自体がオブジェクトの始まりを示すのでしょうか?それとも、ストレージが alignas(X) charbuffer[sizeof(X)] のような式で割り当てられた場合に、以前に発生するのでしょうか?
後者の場合、ストレージ間の条件ステートメントが存在するという興味深い可能性が生じます。割り当てとキャストは、X オブジェクトまたは他の自明なデフォルトで構築可能なエンティティ Y を構築する可能性があります。
標準
残念ながら、C 標準では、このような不定形オブジェクトの作成は明示的に除外されています。 [intro.object]/1 によると、オブジェクトは定義、新しい式、共用体のアクティブなメンバーのアクティブ化、または一時オブジェクトの作成を通じてのみ存在します。
空の存在でもありません
空の初期化ライフタイムの概念は、この状況とは無関係です。この概念を適用するには、まずオブジェクトが存在する必要がありますが、ここでは当てはまりません。
一貫して未定義
C の歴史を通じて、 reinterpret_casting の動作は自明です。デフォルトで構築可能なオブジェクトは一貫して未定義のままです。 C 11 と C 1z はどちらも、個別のオブジェクトには個別のアドレスが必要であるという基本原則を遵守しており、同じストレージ内で複数のオブジェクトを作成することをシュレーディンガーの猫のようなパラドックスとしています。
結論
reinterpret_cast オペレーションは、オブジェクトを作成するための魔法のツールではありません。その創造力を呼び出そうとすると、プログラマーは未定義の動作を引き起こし、コードを予測不能の危険な深みに突っ込む危険を冒します。
以上が「reinterpret_cast」が実際にオブジェクトを作成するのはいつですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。