一時オブジェクトのサブオブジェクトへの Const 参照のバインドについて
C コードでは次のようになります。
<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() の有効期間に関しては、コンパイラによって動作が異なります。 GCC は main で printf に入る前に一時ファイルを破棄しますが、Clang はその有効期間を参照 x の有効期間と一致するまで延長します。ただし、x メンバーと y メンバーをカスタム クラス Double に置き換えると、両方のコンパイラが同意し、一時クラスの有効期間が延長されます。
標準的な考慮事項
この動作は、次の方法で解決されます。 CWG 1651 では、prvalue に適用されるメンバー アクセスまたは添字式の結果は xvalue であり、一時オブジェクトのそのようなサブオブジェクトへの参照をバインドすることによってその有効期間が延長されるべきではないと規定されています。どちらのコンパイラも center().x を prvalue として扱いますが、CWG 1651 によって提案された変更を完全には実装していません。
コンパイラの違い
GCC
Clang
将来の標準の変更
DR 1651 に対する保留中の決議であるN3918 では、メンバー式を介して一時的にアクセスすることでその有効期間を延長する必要があることが明確になります。この変更が採用されると、Clang の動作が標準と一致することになります。
以上が## Const 参照を一時オブジェクトのサブオブジェクトにバインドすると、C での寿命は延長されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。