2014-03-03 39 views
6

在问候时,临时对象被摧毁,这是有效的:使用字符串::临时串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 

这表明整个语句先进行计算,然后所有的临时被破坏。此订购是由标准还是特定于实施的?

回答

9

该表达式的末尾将临时销毁,即;分号。 所以你很安全。

§12.2 ...临时对象被销毁在 最后一步评估充分表达式(1.9)是(词法)包含了他们所创造的 点。即使评估 以抛出异常结束,情况也是如此。

1

此订购由标准或特定实施方案授权吗?

[class.temporary]/3

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

所以它的标准为

相关问题