Как обрабатывать составные операторы / побочные эффекты в шаблонах выражений
При реализации шаблонов выражений для типа вектор / массив я неизбежно дошел до того, что мне нужно предоставить operator +=
,
Использование схемы шаблона выражения "по умолчанию" дает неинтуитивные результаты. Выражение a += b
не возвращает результат вычисления, а скорее ссылку на левый операнд, который посредством побочного эффекта оператора увеличивается на величину b
, Если operator+=()
теперь возвращает шаблон выражения, а не сразу вычисляет результат, a += b;
не будет иметь эффекта, который, вероятно, будет довольно удивительным при использовании этой схемы.
Есть ли какой-нибудь изощренный способ обработки составных операторов присваивания и / или побочных эффектов в контексте шаблонов выражений?
Я могу думать о трех возможностях прямо сейчас:
Используйте шаблоны выражений по умолчанию и документируйте, что шаблон выражения должен быть оценен (какими бы ни были предоставлены средства).
Используйте специальные шаблоны выражений, в которых есть деструктор, который при необходимости выполняет вычисления побочных эффектов.
Предоставьте составные операторы присваивания, которые вообще не используют шаблоны выражений, а сразу выполняют вычисления побочных эффектов.
Я склонен к использованию 3, потому что у двух других есть свои недостатки. Хотя те, что для 1, вероятно, довольно очевидны, 2 имеет проблему, заключающуюся в том, что при построении шаблона выражения необходимо обеспечить, чтобы фактическое вычисление побочного эффекта выражения не генерировалось, если деструктор noexcept должен быть сохранен. На практике это может быть проблематично.