Reinterpret_cast とデフォルト コンストラクターの作成
C では、適切に配置されたメモリ上で reinterpret_cast を使用して特定のオブジェクトを簡単に作成できます。ただし、そのような操作の動作と影響については明確にする必要があります。
元の cppreference ステートメントは、単純なデフォルト コンストラクターを持つオブジェクトが reinterpret_cast を使用して作成できることを示唆しており、次のコードが有効であることを暗示しています:
struct X { int x; }; alignas(X) char buffer[sizeof(X)]; reinterpret_cast<X*>(buffer)->x = 42;
ただし、cppreference ステートメントの新しい表現では、ストレージを再解釈することでオブジェクトを単純に作成することはできず、これを避けるためには place-new が必要であることが強調されています。未定義の動作。これにより、いくつかの疑問が生じます:
最初のステートメントの正確さ
cppreference の更新されたステートメントは正確です。 C とは異なり、C では適切なメモリを再解釈するだけではオブジェクトを作成できません。言語標準によれば、オブジェクトは、定義、新しい式などの明示的なメカニズムを通じて、または共用体のアクティブなメンバーを暗黙的に変更するときに作成されます。
指定されたコード スニペットでは、オブジェクトの作成は行われません。メモリは潜在的な X オブジェクトに割り当てられますが、オブジェクトはコードに正式に導入されません。このメモリに基づいて X オブジェクトが存在するかのように振る舞うと、未定義の動作が発生します。
ライフタイムとストレージの取得
バッファ宣言の前に alignas 指定子を配置すると、適切な位置合わせが保証されます。 X オブジェクトの場合。ただし、メモリの割り当てによってオブジェクトの有効期間が開始されるわけではありません。
alignas(X) char buffer[sizeof(X)]; // (A)
同様に、reinterpret_cast も X オブジェクトのストレージを取得しません。
reinterpret_cast<X*>(buffer)->x = 42; // (B)
オブジェクトがないため
C からの変更点11 to C 1z
引用文の解釈は C 11 と C 1z の間で変わりません。 C 11 では、オブジェクトの作成に関する中心的な段落は C 1z で導入されたものと似ています。この特定の段落は現在、C 1z の「オブジェクト」の定義とみなされますが、その解釈は変わりません。
元の cppreference ステートメントは、 reinterpret_cast によるオブジェクトの作成を暗示しており、C のオブジェクト作成ルールの誤解や誤解を招く可能性があります。更新された文言は、この操作の本質を正確に反映しており、オブジェクトがいつ作成され、その存続期間がどのように始まるかを明示的に定義する言語標準に準拠しています。
以上が「reinterpret_cast」はいつ C でオブジェクトを作成しますか? オブジェクトの有効期間への影響は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。