ホームページ  >  記事  >  バックエンド開発  >  ## Const 参照を一時オブジェクトのサブオブジェクトにバインドすると、C での寿命は延長されますか?

## Const 参照を一時オブジェクトのサブオブジェクトにバインドすると、C での寿命は延長されますか?

DDD
DDDオリジナル
2024-10-26 04:20:02410ブラウズ

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

一時オブジェクトのサブオブジェクトへの 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

  • スカラー サブオブジェクトは [dcl.init.ref]/(5.2.1.1) では一時的とみなされないため、有効期間は延長されません。

Clang

  • メンバーのアクセスを認識し、キャストの処理も含めた有効期間延長ルールをすでに実装しています。

将来の標準の変更

DR 1651 に対する保留中の決議である

N3918 では、メンバー式を介して一時的にアクセスすることでその有効期間を延長する必要があることが明確になります。この変更が採用されると、Clang の動作が標準と一致することになります。

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

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