怀疑C++面试问题

Tra*_*acy 4 c++ const reference temporary

我已经阅读了C++面试问题的答案,其中有一个令我困惑的问题:

问:C++编译器何时创建临时变量?

答:如果函数参数是"const引用",则编译器按以下两种方式生成临时变量.

a)实际参数是正确的类型,但它不是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
Run Code Online (Sandbox Code Playgroud)

b)实际参数的类型错误,但是可以转换为正确类型的类型

 long temp = 3L;
 double value = cuberoot(temp); // long to double conversion
Run Code Online (Sandbox Code Playgroud)

我的问题是,一旦函数参数是一个const引用,为什么编译器生成临时变量,是不是自相矛盾?此外,如果函数Cube无法编译,因为它修改了const参数?

AnT*_*AnT 7

我不认为这里有任何自相矛盾的地方.如果参数不是左值,或者类型错误,则由于显而易见的原因,引用不能直接附加到参数; 因此需要一个正确类型的中间临时.该引用附加到该临时值.

Cube函数确实被破坏(格式错误),因为它试图修改一个const值.