Использование 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), которое (лексически) содержит точку, где они были созданы.
поэтому его обязывает стандарт