Ссылка int
не может быть привязана к объекту типа double
, потому что типы не совпадают.
Таким образом, чтобы инициализация ссылки вообще работала, новый временный объект правильный тип int
должен быть создан. Это возможно, поскольку существует неявная последовательность преобразования из double
в int
.
. Затем ссылка должна привязываться к этому временному значению, то есть к выражению rvalue, но разрешено только const
ссылкам lvalue привязать к значениям. Не const
lvalue ссылки не могут делать это, что делает вторую программу плохо сформированной.
Обратите внимание, что в первой программе, хотя ссылка привязана к временному объекту, который обычно уничтожается при конец полного выражения, в котором он был создан, привязка к ссылке продлевает время жизни этого временного объекта до времени жизни ссылки. Таким образом, использование r
в первой программе на самом деле нормально.
Однако доступ через r
будет относиться не к d
, а к тому новому временному объекту, который не зависит от d
, что может быть удивительным, и поэтому я думаю, что это не очень хорошая идея, чтобы писать так. Используйте auto&
или const auto&
, чтобы убедиться, что r
обязательно будет ссылаться на d
и что не будет никакого неявного преобразования из-за несоответствия типов. Если вы хотите преобразование, просто используйте int
вместо ссылки на int
.