Заинтересовал что-то меня вопрос о том, зачем было делать ссылки частью системы типов. Фактически они работают как синонимы, не могут храниться в массивах и пр. и пр. Я уже не говорю о привнесенной в язык сложности, которую усиливает новый стандарт посредством rvalue-ссылок.
При этом появились ссылки исключительно ради перегрузки операторов, т.к. указатели не позволяли это сделать. Если верить D&E.
Не лучше ли было сделать механизм квалификаторов для «синонимов»(что-то вроде ref в C#, только с учетом константности), чтобы программист мог указывать, что функция принимает аргумент/возвращает значение по ссылке, а не по значению. Проблему перегрузки операторов это решает полностью, сложности никакой не представляет, систему типов не усложняет.