假设我们有一些结构,A,数学运算符重载,如+, - ,*,/等等。如果我们有一个等式
A a1, a2, a3, a4, a5;
A a6 = a1*a2 + a3/a4 + 15;
创造了中间体;例如a1 * a2的结果和a3 / a4的结果(然后加在一起)。我的问题是,这些中间体什么时候被破坏?
在gcc 4.2.1上进行编译,在创建 a6之后,中间体似乎被破坏了。这是否适用于所有编译器?标准中是否有关于此的内容?
由于
答案 0 :(得分:2)
我只能访问标准的草稿版本,但来自12.2.3
:
临时对象作为最后一步被销毁 在评估全表达式(1.9)时(词法上)包含创建它们的点。
定义完整表达式,来自1.9.10
:
full-expression是一个表达式,它不是另一个表达式的子表达式。
除了两个特殊情况(12.2.4
和12.2.5
)之外,这是真的:
有两种情况下,临时人员在不同时刻被摧毁,而不是在完全结束时 表达。第一个上下文是调用默认构造函数来初始化数组的元素。如果 构造函数有一个或多个默认参数,破坏默认情况下创建的每个临时值 参数表达式在构造下一个数组元素之前进行排序,如果有的话。
第二个上下文是引用绑定到临时的。引用所在的临时值 绑定或临时,即绑定引用的子对象的完整对象仍然存在 对于参考的生命周期,除了......
我遗漏了第二个特例的说明,因为它不适用于此处 - 您的示例包含在12.2.3
中。
答案 1 :(得分:-1)
我不确定标准,但你可以检查它们何时被一个精心设计的析构函数函数用于上述类。 任何编译器的一般经验法则是在删除对该对象的所有引用时销毁对象,即没有其他对象引用此对象时。