定数参照をサブオブジェクトにバインドするときの動作テンポラリのは C 標準によって定義されており、コンパイラ ベンダーによって異なります。
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