「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > ## **定数参照を一時オブジェクトのサブオブジェクトにバインドすると、その存続期間は延長されますか? GCC と Clang の物語**

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

2024 年 11 月 9 日に公開
ブラウズ:349

##  **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.

解説

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

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

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

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

結論

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3