const引用可以赋值为int吗?

Foo*_*ooo 10 c++ memory const reference

我遇到了一段代码片段

const int& reference_to_const_int = 20;
cout<<"\n  reference_to_const_int = "<<reference_to_const_int<<endl;     
Run Code Online (Sandbox Code Playgroud)

此代码使用输出编译和执行: -

reference_to_const_int = 20
Run Code Online (Sandbox Code Playgroud)

这对我来说很奇怪.据我所知,引用不占用内存,它们是其他变量的别名.因此我们不能说

int& reference_to_int = 30;
Run Code Online (Sandbox Code Playgroud)

上述声明不得编译给出错误: -

 error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’
Run Code Online (Sandbox Code Playgroud)

"const int&"案件究竟发生了什么?需要完整的解释.

请帮助.

谢谢

Luc*_*ore 11

创建一个临时文件,绑定对它的const引用是合法的,但将它绑定到非const一个是非法的.

它就像:

const int& reference_to_const_int = int(20);  //LEGAL
      int& reference_to_const_int = int(20);  //ILLEGAL
Run Code Online (Sandbox Code Playgroud)

一个const参考延伸的临时的生活,这就是为什么这个工程.这只是语言的一个规则.

  • 但请注意,const引用不会延长所有情况下的生命周期.并且还要注意,Microsoft C++编译器违反了规则并允许绑定非`constst`引用临时值. (4认同)
  • @FlorianSowade没有,const引用延长了一个临时的生命. (3认同)

Vai*_*tle 5

当我们查看绑定对临时对象的引用时会发生什么,这种行为更容易理解.如果我们写

const int& reference_to_const_int = 20; //A temporay object int(20) is created.
Run Code Online (Sandbox Code Playgroud)

编译器将上面的代码转换成如下代码:

int temp = 20;
const int& reference_to_const_int = temp;
Run Code Online (Sandbox Code Playgroud)

如果reference_to_const_int不是const,那么我们可以为reference_to_const_int分配一个新值.这样做不会改变文字20,而是会改变临时对象,因此无法访问.只允许const引用绑定到需要临时值的值,完全避免了这个问题,因为const引用是只读的.

为什么C++允许const引用接受临时对象或RVALUES(如文字)?

我们看到引用最常见的地方是函数参数或返回值.当引用用作函数参数时,对函数内部引用的任何修改都将导致函数外部参数的更改.

如果函数可以期望/接受临时对象或文字作为输入,并且如果函数遵循对象的常量,则使参数成为const引用将允许在所有情况下使用该函数.

临时对象总是const,因此如果不使用const引用,编译器将不接受该参数.

void f(int&) {}
void g(const int&) {}
int main() 
{
    //f(1); //Error
    g(1); //OK 
}
Run Code Online (Sandbox Code Playgroud)