在临时字符串上使用string :: c_str

时间:2014-03-03 12:21:02

标签: c++ destructor temporary-objects

关于临时对象何时被销毁,这是否有效:

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 个答案:

答案 0 :(得分:10)

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

  

§12.2...临时对象作为最后一步被销毁   评估(词法上)包含的全表达式(1.9)   他们被创造的地方。即使进行评估也是如此   以抛出异常而告终。

答案 1 :(得分:1)

  

这种排序是由标准还是特定于实现的?

[class.temporary] / 3

  

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

所以它的标准是

相关问题