在下面,在将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?
答案 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;