Нет точек последовательности, поэтому единственными ограничениями являются то, что аргументы оператору должны быть оценены до того, как сам оператор будет вызван . В вашем случае:
a = b + c + d + e;
означает:
a = (((b + c) + d) + e);
который становится:
a.operator=(operator+(operator+(operator+(b, c), d), e));
(я предполагаю, что здесь что operator=
является членом, как это требуется по стандарту , но это operator+
является бесплатной функцией, как обычно.)
Как это происходит, в этом конкретном выражении зависимости операндов налагают строгий порядок.
Что касается временных, это зависит от реализации operator+
, но дать оператору это обычную семантику, необходимо, чтобы каждый вызова возвращает временную (а не ссылку). В этом случае вы будете иметь 3 временных, однажды созданных с возвратом от каждого operator+
, и всех разрушенных в конце полного выражения.
Если вы перегружаете эти операторы, вы можете использовать отладчик или диагностический вывод для определения заказа. Что происходит, когда вы это делаете? –