Question

In regards to when temporary objects get destroyed, is this valid:

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

Will the temporary be destroyed immediately after having evaluated the first argument to fopen or after the fopen call.

Testing with the following code:

#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;
}

gives:

c_str
~A
after

which indicates that the whole statement is first evaluated, and then any temporaries are destroyed. Is this ordering mandated by the standard or implementation-specific?

Was it helpful?

Solution

The temporary will be destroyed at the end of the expression, namely the ; semicolon. So you are safe.

§ 12.2 ... Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created. This is true even if that evaluation ends in throwing an exception.

OTHER TIPS

Is this ordering mandated by the standard or implementation-specific?

[class.temporary]/3

Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created.

so its mandated by the standard

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top