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 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)