Если вы не вернетесь по ссылке, вы вернетесь по значению и не сможете присвоить значение, поскольку присваиваются только значения l. Даже если бы вы могли, это не имело бы значения, потому что объект, который вы назначили, был бы уничтожен вскоре после того, как вы его назначили, потому что это всего лишь копия объекта, а не сам объект.
По сути, вы пытаетесь сделать это:
int blah() { int blah = 5; return blah; }
blah() = 99;
Что, как вы видите, явно неверно.
Это зависит от того, в каком порядке вы выполняете назначения, потому что эта проблема возникнет только тогда, когда вы измените естественный порядок назначений, сделав один слева перед первым справа, как пример Оли в комментарии. на этот ответ:
(a = b) = c
Другая причина состоит в том, чтобы исключить ненужное копирование, хотя оптимизация компилятора может лишить этого преимущества.
Вы можете прочитать больше о lvalues и rvalues здесь: http://msdn.microsoft.com/en-us/library/bkbs2cds.aspx