Поскольку complex& operator+=(const T& val);
работает на this
и потому что complex operator+(const T& val);
должен создать новый временный объект для суммы.
Если бы вы возвращали объект из +=
, он бы , вероятно, сделал бы то, что ожидал, но там могли бы быть некоторые дополнительные копии. Как вы упомянули, вы бы хотели бы такое поведение, если вы хотите связывать вызовы. Если вы вернули временное и написали (a += b) += c
, ваше добавление c
будет потеряно, когда оно будет уничтожено во временном.
Если бы вы возвращали ссылку из +
, у вас была бы ссылка на временный объект, и ваша программа имела бы неопределенное поведение. Вы можете написать a=b+c+d
, потому что b+c
создает временный b1
, а b1 + d
создает временный b2
, который затем присваивается a
.