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