【问题标题】:Lifetime of return value in comma separated statements逗号分隔语句中返回值的生命周期
【发布时间】:2011-10-19 11:12:27
【问题描述】:

下面三个注释行的执行顺序有保证吗?

struct S
{
    S() { /* called 1st */ }
    ~S() { /* called 3rd */ }
};

boost::shared_ptr<S> f() 
{
    return boost::shared_ptr<S>(new S); 
}

int second() { return 0; /* called 2nd */ }

int test()
{
    return (f(), second());
}

使用我的编译器,f() 返回的 shared_ptr 似乎会持续到调用 second() 之后。但这是否由标准以及其他编译器保证?

【问题讨论】:

标签: c++ shared-ptr comma


【解决方案1】:

是的

临时文件一直持续到full-expression 完成。

[n3290: 12.2/3]: 当实现引入临时 具有非平凡构造函数的类的对象(12.1, 12.8),它应确保为临时对象调用构造函数。同样,应调用析构函数以用于临时 一个重要的析构函数(12.4)。临时对象被销毁为 评估完整表达式(1.9)的最后一步(词法上) 包含它们的创建点。这是真的,即使那 评估以抛出异常结束。 价值计算和 销毁临时对象的副作用仅与 完整的表达式,而不是任何特定的子表达式。

还有:

[n3290: 1.9/10]: 完整表达式是不是 另一个表达式的子表达式。 如果语言结构是 定义为产生函数的隐式调用,使用 语言结构被认为是一种表达方式 这个定义的。在结束时生成的对析构函数的调用 临时对象以外的对象的生命周期是隐式的 充分表达。应用于表达式结果的转换 为了满足语言结构的要求,其中 出现的表达式也被认为是 充分表达。 [..]

这意味着f()second() 都应该存在,直到执行从test() 返回并评估后者。

【讨论】:

    猜你喜欢
    • 2011-09-08
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2013-02-23
    相关资源
    最近更新 更多