1

假设我们有一些结构体 A,其中重载了数学运算符,如 +、-、* 等。如果我们有一个等式

A a1, a2, a3, a4, a5;
A a6 = a1*a2 + a3/a4 + 15;

创建了中间体;例如 a1*a2 的结果和 a3/a4 的结果(然后将它们相加)。我的问题是,这些中间体什么时候被破坏?

在 gcc 4.2.1 上编译,中间体似乎在a6 创建后被破坏。所有编译器都会发生这种情况吗?标准中有关于此的内容吗?

谢谢

4

2 回答 2

2

我只能访问标准的草稿版本,但来自12.2.3

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

使用完整表达式的定义,从1.9.10

完整表达式是不是另一个表达式的子表达式的表达式。

这是真的,除了两种特殊情况(12.2.412.2.5):

有两种情况,其中临时对象在与完整表达式结尾不同的点被销毁。第一个上下文是调用默认构造函数来初始化数组元素时。如果构造函数有一个或多个默认参数,则在默认参数表达式中创建的每个临时变量的销毁将在构造下一个数组元素(如果有)之前进行排序。

第二个上下文是引用绑定到临时的。引用绑定到的临时对象或作为引用绑定到的子对象的完整对象的临时对象在引用的生命周期内持续存在,除了...

我省略了第二种特殊情况的说明,因为它不适用于此处-您的示例包含在12.2.3.

于 2013-04-30T04:18:49.447 回答
-1

我不确定标准,但您可以检查它们何时被所述类的精心设计的析构函数破坏。
任何编译器的一般经验法则是在删除对该对象的所有引用时销毁该对象,即当没有其他对象引用该对象时。

于 2013-04-30T02:50:47.970 回答