方程中中间产物的破坏

Destruction of intermediates in an equation

本文关键字:中间 方程中      更新时间:2023-10-16

假设我们有一个结构体A,其中有重载的数学操作符,如+、-、*、/等。如果我们有一个方程

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

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

在gcc 4.2.1上编译时,在 a6被创建后,中间体似乎被销毁了。所有编译器都会发生这种情况吗?标准中有关于这方面的规定吗?

谢谢

我只能获得标准的草案版本,但是来自12.2.3:

临时对象在最后一步被销毁在计算(词法上)包含创建点的完整表达式(1.9)时

与一个完整表达式的定义,从1.9.10:

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

除了两种特殊情况(12.2.412.2.5)之外,

有两种上下文中,临时变量在不同于full-结束的位置被销毁表达式。第一个上下文是调用默认构造函数初始化数组元素的时候。如果构造函数有一个或多个默认参数,销毁在默认值中创建的每个临时参数参数表达式在构造下一个数组元素(如果有)之前进行排序。

第二个上下文是当引用绑定到临时对象时。引用所指向的临时对象绑定的或临时的,它是引用被绑定到的子对象的完整对象在引用的生命周期内,除了…

我省略了第二种特殊情况的说明,因为它不适用于这里—您的示例包含在12.2.3中。

我不确定这些标准,但是您可以检查它们何时被为上述类设计良好的析构函数函数销毁。
任何编译器的一般经验法则都是:当所有对该对象的引用都被删除时销毁该对象,当没有其他对象引用该对象时销毁该对象。