10

我遇到了一个代码片段

const int& reference_to_const_int = 20;
cout<<"\n  reference_to_const_int = "<<reference_to_const_int<<endl;     

此代码编译并执行输出:-

reference_to_const_int = 20

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

int& reference_to_int = 30;

上述语句不应编译给出错误:-

 error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’

在“const int&”的情况下到底发生了什么?需要一个完整的解释。

请帮忙。

谢谢

4

2 回答 2

11

创建了一个临时对象,将const引用绑定到它是合法的,但将其绑定到非引用是非法的const

就像:

const int& reference_to_const_int = int(20);  //LEGAL
      int& reference_to_const_int = int(20);  //ILLEGAL

const引用延长了临时的生命,这就是为什么它有效。这只是语言的规则。

于 2012-05-29T15:13:29.140 回答
5

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

const int& reference_to_const_int = 20; //A temporay object int(20) is created.

编译器将上面的代码转换成这样的:

int temp = 20;
const int& reference_to_const_int = temp;

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

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

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

如果函数可以期望/接受临时对象或文字作为输入,并且如果函数尊重对象的 const 性,则将参数设置为 const 引用将允许在所有情况下使用该函数。

临时对象始终是 const,因此如果您不使用 const 引用,编译器将不会接受该参数。

void f(int&) {}
void g(const int&) {}
int main() 
{
    //f(1); //Error
    g(1); //OK 
}
于 2012-10-03T15:39:58.177 回答