方程中中间产物的破坏
Destruction of intermediates in an equation
假设我们有一个结构体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.4
和12.2.5
)之外,
有两种上下文中,临时变量在不同于full-结束的位置被销毁表达式。第一个上下文是调用默认构造函数初始化数组元素的时候。如果构造函数有一个或多个默认参数,销毁在默认值中创建的每个临时参数参数表达式在构造下一个数组元素(如果有)之前进行排序。
第二个上下文是当引用绑定到临时对象时。引用所指向的临时对象绑定的或临时的,它是引用被绑定到的子对象的完整对象在引用的生命周期内,除了…
我省略了第二种特殊情况的说明,因为它不适用于这里—您的示例包含在12.2.3
中。
我不确定这些标准,但是您可以检查它们何时被为上述类设计良好的析构函数函数销毁。
任何编译器的一般经验法则都是:当所有对该对象的引用都被删除时销毁该对象,当没有其他对象引用该对象时销毁该对象。
相关文章:
- 递归形成字符串中所有数字字符的中间和?
- 使(虚拟)函数在大多数派生类中无法访问中间基类中可访问,定义良好?
- 在 // C++注释中使用 \\ 是否合法?(C++评论中的LaTeX方程)
- 我正在尝试在 C++ 中做一个方程,但它一直输出 1
- 为什么同一个逻辑方程在python和c++中返回两个不同的结果
- C++ 在方程中使用变量;错误:表达式必须具有整数或无作用域枚举类型及其他
- 在 txt 文件中搜索中间子字符串未被选中的字符串
- 在C++中使用RK-4求解洛伦兹方程
- 如何使用第一个、中间和最后一个元素的中位数正确分区?
- 如何从用户那里获取方程的输入并在 c++ 中对其进行评估
- 当中间类跳过实现时,在继承层次结构中执行哪种虚拟方法
- 使用C++未来值作为函数堆栈中的中间值会导致段错误
- 长方程加法/减法计算器,从文本文件中提取运算符和数字
- 如何从LLVM的中间表示中获取在程序的每个函数中执行的函数调用列表
- 在方程中使用 2D 数组
- 浮点计算更改(如果存储在中间变量中"double"
- 从平面方程中生成点网格的算法
- 方程中中间产物的破坏
- C++03 链接器"already defined symbol"未显示在中间文件中
- 在同一个方程中增加f(++i)和g(++i)会输出相同的i值