const关键字的必要性是什么

what is const keyword necessary

本文关键字:是什么 必要性 关键字 const      更新时间:2023-10-16

我的代码不编译。

int foobar()
{
    // code
    return 5;
}
int main()
{
   int &p = foobar(); // error
   // code
   const int& x = foobar(); //compiles
}

为什么添加关键字const会使代码编译?

在C++中,临时库不能绑定到非常量引用。

在中

 int &p = foobar(); 

右值表达式foobar()生成一个临时值,该临时值不能绑定到p,因为它是一个非常量引用。

 const int &x = foobar();

将临时附加到作为常量引用的x可以延长其使用寿命。这是完全合法的。

因为foobar()按值返回;这个结果是暂时的。不能有临时的非常量引用。

如果这不是真的,这个代码会做什么?

int &x = foobar();
x = 1;  // Where are we writing to?

正如其他人所说,您可以接受对临时的const引用,但不能接受非const引用。

在实践中,允许非常量引用临时性会有危险:

#include <iostream>
void foo(int &i) {
    i = 5;
}
int main() {
    long l = 4;
    foo(l);
    std::cout << l << "n";
}

现在,l可以隐式转换为int,因此,如果这里允许对临时的非常数引用,那么可能会向foo传递对该转换结果的引用,就像fooconst int &时一样。将对临时工进行分配,然后在临时工被销毁时丢弃。这更可能是一个令人困惑的错误,而不是预期的结果。

我不知道是否有一套整洁的规则可以在某些情况下允许对临时性的非常量引用,但在危险/烦人的情况下不允许,但即使是这样,C++标准也不包括它们。请注意,C++0x具有右值引用,它允许您使用临时变量做一些在C++03中无法完成的额外事情。