ホームページ > バックエンド開発 > C++ > ## **定数参照を一時オブジェクトのサブオブジェクトにバインドすると、その存続期間は延長されますか? GCC と Clang の物語**

## **定数参照を一時オブジェクトのサブオブジェクトにバインドすると、その存続期間は延長されますか? GCC と Clang の物語**

Barbara Streisand
リリース: 2024-11-01 06:58:02
オリジナル
578 人が閲覧しました

##  **Does Binding a Constant Reference to a Sub-Object of a Temporary Extend Its Lifetime? A Tale of GCC and Clang**

一時的なサブオブジェクトへの定数参照のバインド

標準動作

定数参照をサブオブジェクトにバインドするときの動作一時ファイルの定義は C 標準によって定義されており、コンパイラ ベンダーによって異なります。

GCC と Clang の違い

  • GCC (バージョン 5.2.0): main で printf を入力する前に一時的な P2d インスタンスを破棄し、別の一時的な double を作成して値を保持します。
  • Clang (バージョン X): 一時的な P2d インスタンスのライフタイムを次のライフタイムまで延長します。 x 参照。main で printf の後にデストラクターを呼び出します。

説明

CWG 1651 によれば、prvalue に適用されたメンバー アクセスまたは添字式の結果は次のように扱われます。 xvalue。これは、一時オブジェクトのそのようなサブオブジェクトへの参照をバインドすることで、一時オブジェクトの有効期間を延長してはならないことを意味します。

ただし、提供されている例では、両方のコンパイラが center().x を prvalue として扱います。スカラー サブオブジェクトは [dcl.init.ref]/(5.2.1.1) でカバーされていないため、GCC はスカラー サブオブジェクトの使用期間を延長しません。したがって、一時オブジェクトは早期に破棄できます。

対照的に、Clang は DR 1651 に対する保留中の解決策を実装しました。これは、E1 が一時的な式であり、E2 がビットフィールドを指定していない場合、E1 が指定されると述べています。 .E2 は一時的な式です。この定義によれば、center() は一時的な式であるため、[class.temporary] /5 の変更された文言が適用されます。これは、対応する一時オブジェクトが参照の存続期間中存続することを明示的に示しています。

したがって、この場合、Clang は一時的な P2d インスタンスの存続期間を延長しますが、GCC は延長しません。

結論

GCC と Clang の両方の現在の動作は、C 標準の改訂案が採用されると変更されることが予想されます。

以上が## **定数参照を一時オブジェクトのサブオブジェクトにバインドすると、その存続期間は延長されますか? GCC と Clang の物語**の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート