const引用非const对象

时间:2011-09-13 18:55:15

标签: c++ reference

在下面,在将const引用用于非const对象之前是否会创建一个临时对象?

const int y = 2000;
const int &s = y // ok, const reference to const object.

int x = 1000;
const int &r = x; // any temporary copy here?

如果不是,那该怎么办?

   const int z = 3000;
   int &t = z // ok, why can't you do this?

3 个答案:

答案 0 :(得分:16)

没有

引用只是现有对象的别名。 const由编译器强制执行;它只是检查您是否尝试通过引用r修改对象。 * 这不需要创建副本。

鉴于const仅仅是编译器强制执行“只读”的指令,那么为什么最终的例子不能编译就应该很明显。如果您可以通过将非const引用转换为const对象来轻易绕过它,那么const将毫无意义。

*当然,您仍然可以通过x自由修改对象。任何更改也将通过r显示,因为它们引用相同的对象。

答案 1 :(得分:5)

int x = 1000;
const int &r = x;

右侧是左值x的类型与引用的类型相同(忽略cv资格)。在这些情况下,引用直接附加到x,不会创建临时。

至于"这是如何工作的?... ...我不明白是什么促使你的问题。它只是以最直接的方式工作:引用直接附加到x。没有更多的东西。

你无法做到

const int z = 3000;
int &t = z;

因为它立即违反了const-correctness规则。

答案 2 :(得分:1)

对参考文献(&)的理解回答了这个问题..

引用只是分配给它的变量的别名..

const是编译器对声明为const

的变量施加的约束
int x = 1000;
const int &r = x;

在这种情况下,它是对非const变量的const引用。因此,您无法使用引用变量r更改x的数据(只是执行只读)..但您仍然可以通过修改x来更改数据x

const int z = 3000;
int &t = z

在这种情况下,非const引用const成员是没有意义的。你说引用可以允许你编辑一个const成员(这是永远不可能的)..

因此,如果你想为const成员创建一个引用,它必须像你提到的第一个案例

const int z = 3000;
const int &t = z;