在为向量/数组类型实现表达式模板时,我不可避免地遇到了需要提供operator +=
.
使用“默认”表达式模板方案会产生不直观的结果。表达式a += b
不返回计算结果,而是对左操作数的引用,通过操作符的副作用,左操作数增加了 value b
。如果operator+=()
现在返回一个表达式模板而不是立即计算结果,a += b;
则不会产生任何效果,这在使用此方案时可能会相当令人惊讶。
在表达式模板的上下文中是否有任何复杂的方法来处理复合赋值运算符和/或副作用?
我现在能想到三种可能:
使用默认表达式模板并记录必须评估表达式模板(通过提供的任何方式)。
使用具有析构函数的特殊表达式模板,必要时执行副作用计算。
提供完全不使用表达式模板而是立即执行副作用计算的复合赋值运算符。
我倾向于使用3,因为其他两个有各自的缺点。虽然1的那些可能相当明显,但2的问题是表达式模板的构造必须确保表达式副作用的实际计算不会抛出,如果要维护析构函数 noexcept。这在实践中可能是有问题的。