ホームページ >バックエンド開発 >C++ >## Const 参照を一時オブジェクトのサブオブジェクトにバインドすると、その有効期間は延長されますか?

## Const 参照を一時オブジェクトのサブオブジェクトにバインドすると、その有効期間は延長されますか?

DDD
DDDオリジナル
2024-10-26 07:22:30506ブラウズ

## Does Binding a Const Reference to a Sub-Object of a Temporary Extend Its Lifetime?

一時オブジェクトのサブオブジェクトへの Const 参照のバインディング

次のコードを考えてみましょう。

<code class="cpp">#include <stdio.h>

struct P2d {
    double x, y;
    P2d(double x, double y) : x(x), y(y) {}
    ~P2d() { printf("Destructor called\n"); }
};

P2d center() {
    return P2d(10, 10);
}

int main(int argc, const char *argv[]) {
    const double& x = center().x;
    printf("x = %.18g\n", x);
    return 0;
}</code>

この例では、 center()一時的な P2d オブジェクトを返します。この一時オブジェクトの有効期間はどれくらいですか?

コンパイラの動作の違い

異なるコンパイラは異なる動作を示します:

  • g (バージョン 5.2.0) は、main で printf に入るに一時的な P2d オブジェクトを破棄します。ただし、x メンバーの値は保持されます。特に、サブオブジェクトがクラスまたは配列型の場合にのみ、一時オブジェクトの存続期間が延長されます。
  • clang は、一時 P2d オブジェクトの存続期間を x 参照の存続期間まで延長します。したがって、デストラクタは main の printf のに呼び出されます。

C 標準によれば、テンポラリのサブオブジェクトへの参照をバインドしても、テンポラリの有効期間は延長されません。 。ただし、これは CWG 1651 でカバーされており、そのような場合に有効期間を延長するための変更が提案されています。

保留中の解決策

現状では、prvalue のみが一時値を参照するものとして扱われます。ただし、 center().x のようなメンバー アクセス式は、 g と clang の両方によって prvalue とみなされます。

  • g は、スカラー サブオブジェクトを使用する場合、有効期間を延長しません。 .init.ref]/(5.2.1.1) はそれらをカバーしていません。
  • clang はすでに「新しい」ライフタイム延長ルールを実装しており、CWG 1651 が解決されると正しい動作になります。 .

今後の解決策では、メンバー アクセス式の結果として一時的な式が生成されること、およびこれらの式への参照をバインドすると、対応する一時オブジェクトの存続期間が延長されることが明確になります。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。