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) 的最后一步被销毁,完整表达式 (1.9) 包含它们被创建的点。即使评估以抛出异常结束也是如此。

于 2014-03-03T12:23:05.093 回答
1

这种排序是标准规定的还是特定于实施的?

[class.temporary]/3

临时对象被销毁作为评估完整表达式(1.9)的最后一步,该完整表达式(在词法上)包含它们被创建的点。

所以它是由标准规定的

于 2014-03-03T12:24:28.043 回答