2014-03-03 78 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),該(詞法)包含在其中創建它們的點的最後一步 。

所以它的標準爲

相關問題