Использование string::c_str во временной строке

Относительно того, когда временные объекты уничтожаются, действительно ли это:

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

что означает, что сначала проверяется все утверждение, а затем уничтожаются все временные значения. Этот порядок предписан стандартом или реализацией?

2 ответа

Решение

Временное будет уничтожено в конце выражения, а именно ; точка с запятой. Так что вы в безопасности.

§ 12.2... Временные объекты уничтожаются как последний шаг в оценке полного выражения (1.9), которое (лексически) содержит точку, где они были созданы. Это верно, даже если эта оценка заканчивается выдачей исключения.

Этот порядок предписан стандартом или реализацией?

[Class.temporary]/3

Временные объекты уничтожаются как последний шаг в оценке полного выражения (1.9), которое (лексически) содержит точку, где они были созданы.

поэтому его обязывает стандарт

Другие вопросы по тегам