4

我试图了解表达式模板的一个方面。

假设我们正在将该技术应用于矩阵。

假设我们有三个a,b,c类型的具体矩阵Matrix<double, ConcreteMatrix<double>>。这里的类Matrix<double, T>只是一个包含 type 成员的 shell TConcreteMatrix<double>是实际的矩阵类。

operator+()在应用于两个对象的表达式模板中a + b,返回一个类型为 的对象Matrix<double, Sum<type(a),type(b)>>,我在其中编写type(a)并且type(b)不会使代码更短且更易于阅读。

在内部,该类Sum<T,S>存储了两个对对象的**常量引用**ab.

我的问题是在计算时出现的(a + b) + c。好吧,更精确的计算Matrix<double, ConcreteMatrix<double>> d = (a + b) + c。让我在这里回忆一下,它operator=负责实际进行计算并填充d结果。

我们已经operator+(a, b)返回了Matrix真正的Sum内部。如果我理解正确的话,这个对象是临时的。让我们称之为pab。现在是执行的时候了。operator+(pad, c)这个返回一个类型的对象Matrix<double,Sum<type(pad),type(c)>>,其中包含对和的常量引用。我们称它为对象。pabcppabc

我了解 pab 在operator+(pad,c). 因此,可以创建ppabc包含对pab.

问题:但是当我们外出时会发生什么operator+(pad, c)pab我们出去的时候不应该“死”operator+(pad, c)吗?情况似乎并非如此。为什么?(我已经执行了 Todd Veldhuizen 和 David Vandevoorde 的书中所写的实现,它工作正常。)这意味着临时pab仍然存在于身体之外,operator+(pad, c)并且该运算符返回的对象仍然可以访问其引用pab并请求它包含的值。

我想确切地了解这个临时超出我想象的范围的根本原因是什么,因为我想应用表达式模板的技术来获得其他函数的惰性求值,比如exp(). 我遇到了麻烦(由于临时被破坏而导致的执行错误)。当我在其中存储一个具体对象而不是引用时,错误消失了Matrix<double, Exponential<type(a)>>。所以理解上面的问题会有所帮助。

4

0 回答 0