我想了解expression templates的一个方面。
我们假设我们正在将该技术应用于矩阵。
假设我们有三个a,b,c
类型的具体矩阵Matrix<double, ConcreteMatrix<double>>
。这里的类Matrix<double, T>
只是一个包含T
类型成员的shell。 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
应该&#39;死亡&#39;当我们到外面operator+(pad, c)
时?这似乎并非如此。为什么? (我已经按照Todd Veldhuizen和David Vandevoorde的书中所描述的那样执行了它的工作正常。)这意味着临时的pab
仍然生活在operator+(pad, c)
的身体之外此运算符返回的对象仍然可以访问其对pab
的引用并询问它包含的值。
我想准确理解为什么这个临时超出我想象的范围的根本原因是什么因为我想应用表达模板技术来对其他函数进行延迟评估,比如说exp()
。我遇到了麻烦(由于暂时被破坏而导致执行错误)。当我在Matrix<double, Exponential<type(a)>>
内存储具体对象而不是引用时,错误消失了。因此,理解上述问题会有所帮助。