Почему обсуждается в C ++ FAQ (boldfacing mine):
В C ++ ссылки, не относящиеся к const, могут связываться с lvalues и ссылки const могут связываться с lvalues или rvalues, но нет ничего, что могло бы связываться с неконстантным значением r. Это необходимо для защиты людей от изменения значений временных объектов, которые уничтожаются до того, как их новое значение может быть использовано. Например:
blockquote>void incr(int& a) { ++a; } int i = 0; incr(i); // i becomes 1 incr(0); // error: 0 is not an lvalue
Если этот incr (0) был разрешен либо временным, что никто никогда не видел, будет увеличиваться или - намного хуже - значение 0 станет 1 . Последнее звучит глупо, но на ранних компиляторах Fortran на самом деле была ошибка, которая выделяла место памяти для хранения значения 0.
blockquote>