A: Provided that function parameter is "const reference", compiler create temporary variable in following two ways.
a) The actual argument is the correct type, however it isn't Lvalue
double Cube(const double & num)
{
num = num * num * num;
return num;
}
double temp = 2.0;
double value = cube(3.0 + temp); // argument is a expression and not a Lvalue;
b) The actual argument is of the wrong type, however of a type which can be converted to the correct type
long temp = 3L;
double value = cuberoot ( temp); // long to double conversion