Я полагаю, что вы правы в том, что куб функции не скомпилирован. Во всяком случае, это должно произойти сбой, и это происходит на моем компиляторе (VC ++ 2008).
Что касается создания временного:
Временное значение для поддержки константной ссылки будет создаваться всякий раз, когда фактический аргумент:
i) неверного типа для ссылки, и,
II) может быть неявно преобразован в правильный тип.
В примере а) из вашего вопроса создается временный double
для хранения значения 3.0 + temp
. Затем вызывается Cube()
со ссылкой const
на временное. Это потому, что вы не можете иметь ссылку на 3.0 + temp
, потому что это не переменная (это rvalue - результат выражения), и поэтому у нее нет адреса памяти, и вы не можете вернуть ссылку. Неявно, компилятор создаст временный double
и затем присвоит ему значение 3.0 + temp
.
В вашем примере б) у вас есть long
, но для вашей функции требуется double
. Компилятор неявно преобразует long
в double
. Это делается путем создания временного double
, присвоения ему преобразованного значения temp
, а затем создания ссылки const
для временного объекта и передачи этой ссылки в cuberoot