定数参照をサブオブジェクトにバインドするときの動作一時ファイルの定義は C 標準によって定義されており、コンパイラ ベンダーによって異なります。
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 サイトの他の関連記事を参照してください。