我试图了解表达式模板的一个方面。
假设我们正在将该技术应用于矩阵。
假设我们有三个a,b,c
类型的具体矩阵Matrix<double, ConcreteMatrix<double>>
。这里的类Matrix<double, T>
只是一个包含 type 成员的 shell T
。ConcreteMatrix<double>
是实际的矩阵类。
operator+()
在应用于两个对象的表达式模板中a + b
,返回一个类型为 的对象Matrix<double, Sum<type(a),type(b)>>
,我在其中编写type(a)
并且type(b)
不会使代码更短且更易于阅读。
在内部,该类Sum<T,S>
存储了两个对对象的**常量引用**a
和b
.
我的问题是在计算时出现的(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)>>
,其中包含对和的常量引用。我们称它为对象。pab
c
ppabc
我了解 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)>>
。所以理解上面的问题会有所帮助。