8

一時オブジェクトがいつ破棄されるかに関して、これは有効ですか:

FILE *f = fopen (std::string ("my_path").c_str (), "r");

呼び出しの最初の引数を評価した直後、fopenまたはfopen呼び出しの後に、一時的なものは破棄されますか。

次のコードでテストします。

#include <cstdio>
using namespace std;
struct A {
        ~A() { printf ("~A\n"); }
        const char *c_str () { return "c_str"; }
};
void foo (const char *s) { printf ("%s\n", s); }
int main () {
        foo (A().c_str());
        printf ("after\n");
        return 0;
}

与えます:

c_str
~A
after

これは、ステートメント全体が最初に評価され、次にすべての一時ステートメントが破棄されることを示します。この順序付けは標準または実装固有で義務付けられていますか?

4

2 に答える 2

11

一時的なものは、式の最後、つまり;セミコロンで破棄されます。だからあなたは安全です。

§ 12.2 ... 一時オブジェクトは、それらが作成されたポイントを (レキシカルに) 含む完全式 (1.9) を評価する最後のステップとして破棄されます。これは、その評価が例外のスローで終了した場合でも当てはまります。

于 2014-03-03T12:23:05.093 に答える
1

この順序付けは標準または実装固有で義務付けられていますか?

[クラス.一時]/3

一時オブジェクトは、それらが作成されたポイントを (レキシカルに) 含む完全な式 (1.9) を評価する最後のステップとして破棄されます。

そのため、標準で義務付けられています

于 2014-03-03T12:24:28.043 に答える