Почему конструктор копии должен быть передан ее параметр ссылкой?
Потому что, если это не по ссылке, то по значению. Для этого вы делаете копию и для этого вызываете конструктор копирования. Но для этого нам нужно создать новое значение, поэтому мы вызываем конструктор копирования и так далее ...
(У вас будет бесконечная рекурсия, потому что «чтобы сделать копию, вам нужно сделать копию». )
Он будет бесконечно рекурсивным, если вы передадите его по значению
Потому что передача по значению вызовет конструктор копирования :)
Альтернативой передаче по ссылке является передача по значению. Передача по значению - это действительно передача по копии. Конструктор копирования необходим для создания копии.
Если бы вам пришлось делать копию только для вызова конструктора копирования, это было бы загадкой.
(Я думаю, что в компиляторе может возникнуть бесконечная рекурсия, и вы никогда не получите такую программу.)
Помимо рациональных причин, это запрещено стандартом в §12.8 / 3:
Объявление конструктора для класса X неверно сформировано, если его первый параметр имеет тип (необязательно cv - квалифицированный) X и либо нет другие параметры или все остальные параметры имеют аргументы по умолчанию.