ホームページ >バックエンド開発 >C++ >C で Const 参照を一時サブオブジェクトにバインドするのはバグですか、それとも予期された動作ですか?

C で Const 参照を一時サブオブジェクトにバインドするのはバグですか、それとも予期された動作ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-26 11:26:29909ブラウズ

Is Binding a Const Reference to a Temporary Sub-Object in C   a Bug or Expected Behavior?

Const 参照を一時サブオブジェクトにバインドする: 難題

以下の C コード スニペットは、異なるコンパイラ間の動作の相違を示しています。 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;  // Bind a reference to temporary's x member
    printf("x = %.18g\n", x); // Expected: 10
    return 0;
}</code>

バグまたは予期される動作?

g のようなコンパイラは、 main で printf に入る前の一時的な P2d インスタンスですが、double メンバー x の値はまだ保持されています。これは、元の一時的なメンバーにバインドするのではなく、別の一時的な double を作成して値をコピーすることで実現されます。

一方、clang は、P2d 一時的な存続期間を x 参照の存続期間と一致するように正しく延長します。 main の printf の後に呼び出されるデストラクター。

この矛盾により、 g の動作はバグなのか、それとも C 標準で許容されるのか?

分析と解決策

CWG 1651 はこの問題を明らかにしています。


サブオブジェクトへの参照をバインドすることで、一時オブジェクトの存続期間を延長するべきではありません。


現在の標準では、クラスや配列などのスカラー以外のオブジェクトは一時オブジェクトの有効期間を延長できます。

コンパイラの動作

  • GCC: CWG 1651 解決に基づいて、クラスまたは配列のサブオブジェクトのみの有効期間を延長します。
  • Clang: N3918 で概説されている有効期間延長ルールをすでに実装しています。これにより、すべての一時サブオブジェクトの有効期間が延長されます。

結論

C 標準の現在の文言に基づくと、GCC の動作は技術的には正しいですが、Clang の実装はDR 1651 で提案されている変更が反映されています。将来、この変更を反映するために規格が改訂される可能性があります。

以上がC で Const 参照を一時サブオブジェクトにバインドするのはバグですか、それとも予期された動作ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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