Часто можно прочитать, что вы не можете привязать обычную ссылку lvalue к временному объекту. Из-за этого часто можно увидеть методы класса A, принимающие const A& в качестве параметра, когда они не хотят использовать копирование. Однако такая конструкция вполне легальна:
double& d = 3 + 4;
потому что он не привязывает временный объект 3 + 4 к ссылке d, а скорее инициализирует ссылку объектом 3 + 4. Как говорится в стандарте, только если значение не имеет типа или ссылки (или унаследовано), ссылка не будет инициализируется с использованием объекта, полученного из временного объекта с помощью преобразования или sth (т.е. другого временного объекта). Вы можете видеть, что в этом случае:
int i = 2;
double & d = i;
Это недопустимо, потому что я не имеет типа double и не наследуется от него. Однако это означает, что временные файлы могут быть привязаны к ссылкам, но действительно ли это является обязательным? Разве это не создание нового объекта с использованием конструктора копирования с временным объектом в качестве параметра?
Поэтому, как я думаю, смысл методов, принимающих const A& param вместо A&, не в том, что во втором случае такой метод не сможет принимать в качестве параметра временный объект типа A (потому что он будет), а в том, что он включает копирование конструктор (так же, как если бы параметр был типа A). Я прав?