7

これは出力されますF~が、私は期待していました~F

#include <iostream>

struct Foo {
    int _x;
    operator const int & () const {return _x;}
    ~ Foo () {std :: cout << "~";}
};

void foo (const int &)
{
    std :: cout << "F";
}

int main ()
{
    foo (Foo ());
}

Most-important-const がルールではなく例外であることを示す反例として、これを作成しました。通常は次のように記述されます。

const 参照が一時オブジェクトにバインドされると、その一時オブジェクトの有効期間が参照の有効期間まで延長されます。

Foo()は一時的なものです_xが、変換演算子によって返されるへの参照はそうではなく、上記のコードは安全ではないことを説明しようとしました。

しかし、出力は、例が安全であることを証明しているようです.一時の寿命はFoo()、そのメンバーの1つへのconst参照の存在によって延長されます.

これは正しいですか?これは標準のどこに指定されていますか?

4

4 に答える 4

6

一時的なものに関する一般的なルールは、彼らが一部である完全な表現が終了したときに(非公式に、に到達したときに;)彼らの人生は終了するということです。

12.2一時的なオブジェクト

3 / [...]一時オブジェクトは、それらが作成されたポイントを(字句的に)含む完全式(1.9)を評価する最後のステップとして破棄されます。これは、その評価が例外のスローで終了した場合でも当てはまります。一時オブジェクトを破棄することによる値の計算と副作用は、特定の部分式ではなく、完全な式にのみ関連付けられます。

于 2011-11-15T09:58:01.277 に答える
1

ここには魔法はありません。すべての関数の引数は、一時的なものを含め、呼び出し元のスコープ内にあります。一時的なFoo()ものは、呼び出し元のスコープ内で作成され、行の終わりで破棄されます。

したがって、関数が実行するものはすべて、の引数が破棄される前にfoo()発生します。main()

于 2011-11-15T09:56:22.037 に答える
1

これは、一時的なものが関数呼び出しの全期間にわたって存続するためです。これを行うと、次foo (Foo ());のことが起こります。

  1. temporaryFooが構築されると、
  2. operator const int&一時的に呼び出されます
  3. foo()が呼び出され、これが出力されますF
  4. 一時的にfoo()返さFooれると破棄され、これが出力されます~
于 2011-11-15T09:54:49.577 に答える
0

ただし、Fooここでのインスタンスは、作成されたステートメントをセミコロンで終了するまで常に存続していました。メンバーへの参照を関数呼び出しに渡しても、それは変わりませんでした。

試す:

int const &ref = Foo();
foo(ref);

Foo const &ref = Foo(); // or function returning temp
foo(ref);
于 2011-11-15T09:58:23.770 に答える