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 はこの問題を明らかにしています。
サブオブジェクトへの参照をバインドすることで、一時オブジェクトの存続期間を延長するべきではありません。
現在の標準では、クラスや配列などのスカラー以外のオブジェクトは一時オブジェクトの有効期間を延長できます。
コンパイラの動作
結論
C 標準の現在の文言に基づくと、GCC の動作は技術的には正しいですが、Clang の実装はDR 1651 で提案されている変更が反映されています。将来、この変更を反映するために規格が改訂される可能性があります。
以上がC で Const 参照を一時サブオブジェクトにバインドするのはバグですか、それとも予期された動作ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。