【问题标题】:Usage of string::c_str on temporary string [duplicate]在临时字符串上使用 string::c_str [重复]
【发布时间】:2014-03-03 12:21:02
【问题描述】:

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

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

这表示首先评估整个语句,然后销毁任何临时对象。这种排序是标准规定的还是特定于实施的?

【问题讨论】:

    标签: c++ destructor temporary-objects


    【解决方案1】:

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

    § 12.2 ... 临时对象作为最后一步被销毁 评估(词汇上)包含的完整表达式(1.9) 它们被创建的地方。这是真的,即使那个评价 以抛出异常结束。

    【讨论】:

      【解决方案2】:

      此顺序是标准规定的还是特定于实施的?

      [class.temporary]/3

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

      所以它是由标准规定的

      【讨论】:

        猜你喜欢
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-02
        • 2018-11-22
        • 2016-06-09
        • 2013-08-31
        • 2011-11-04
        相关资源
        最近更新 更多