2

下面三个注释行的执行顺序是否得到保证?

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());
}

使用我的编译器,shared_ptr返回的 byf()似乎一直持续到 aftersecond()被调用。但这是否由标准以及其他编译器保证?

4

1 回答 1

7

的。

临时工坚持到完成为止full-expression

[n3290: 12.2/3]:当实现引入具有非平凡构造函数(12.1、12.8)的类的临时对象时,它应确保为临时对象调用构造函数。类似地,应该使用非平凡的析构函数(12.4)调用析构函数。临时对象被销毁作为评估完整表达式(1.9)的最后一步,该完整表达式(词法上)包含它们被创建的点。即使评估以抛出异常结束也是如此。销毁临时对象的值计算和副作用仅与完整表达式相关联,与任何特定子表达式无关。

和:

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

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

于 2011-10-19T11:14:47.287 回答