Потому что тогда у вас не будет повторяемого типа, который не может быть 0. Если вы не включили 3 типа ссылок / указателей. Что только усложнит язык из-за небольшого выигрыша (и тогда почему бы не добавить 4-й тип тоже?
Лучший вопрос может быть такой: почему вы хотите, чтобы ссылки были перезаписываемыми? Если бы они были, это сделало бы их менее полезными во многих ситуациях. Компилятору будет сложнее выполнять анализ псевдонимов.
Кажется, что основная причина, по которой ссылки в Java или C # являются перезаписываемыми, заключается в том, что они выполняют работу указателей. Они указывают на объекты. Они не являются псевдонимами для объекта.
Каким должен быть эффект следующего?
int i = 42;
int& j = i;
j = 43;
В сегодняшнем C ++ с невосстановимыми ссылками это просто. j является псевдонимом для i, и i заканчивается значением 43.
Если бы ссылки были перезаписываемыми, тогда третья строка связала бы ссылку j с другим значением. Это больше не псевдоним i, а целочисленный литерал 43 (что, конечно, недопустимо). Или, возможно, более простой (или, по крайней мере, синтаксически правильный) пример:
int i = 42;
int k = 43;
int& j = i;
j = k;
С многоразовыми ссылками. j будет указывать на k после оценки этого кода.
В C ++ не повторяемые ссылки, j по-прежнему указывает на i, и i присваивается значение 43.
Создание ссылок с возможностью повторного использования изменяет семантику языка. Ссылка больше не может быть псевдонимом для другой переменной. Вместо этого он становится отдельным типом значения с собственным оператором присваивания. И тогда один из самых распространенных способов использования ссылок будет невозможен. И ничего не получится взамен. Вновь приобретенный функционал для ссылок уже существовал в виде указателей. Так что теперь у нас есть два способа сделать то же самое, и нет способа сделать то, что делают ссылки в текущем языке C ++.