2011-09-13 125 views
8

在下面,会在const引用被用于非const对象之前创建一个临时对象吗?对非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? 

回答

13

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

鉴于const仅仅是编译器的指令为“只读”执行,那么它应该是立即显而易见的,为什么你的最后一个例子不能编译。 const将是毫无意义的,如果你可以通过对const对象采取非const引用轻松规避它。

*当然,您仍然可以通过x修改对象。任何更改也将通过r可见,因为它们指的是同一个对象。

+1

尤其是第一种情况下,r'的'值可以改变,即使它被声明'const'。 – avakar

+0

通常,编译器通过一个简单的指针来实现引用。 –

+1

@quant_dev给出OP的示例,提到'x'的源代码和提到'r'的源代码被编译为相同的机器代码。没有涉及指针(在我见过的所有编译器上)。不是说它是相关的。 – Cubbi

5

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

右手侧为左值x类型是一样的参考(忽略CV-资格)的类型。在这种情况下,该参考文件直接附于x,不会创建临时文件。

至于“这项工作如何”......我不明白是什么引发了你的问题。它只是以最直接的方式工作:参考直接附于x。没有更多的了。

你不能这样做

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

,因为它违反了立即常量,正确的规则。

+2

+1用于回答这两个部分 – Lou

1

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

参考只是一个别名,它被分配给它的变量..

和const是由编译器所施加的限制到声明为const的变量

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

在这种情况下,它是对非常量变量的const引用。所以不能参考变量r改变x的数据(只是仅作用一个读)..但仍可以通过修改X

const int z = 3000; 
int &t = z 

在这种情况下,非常量引用常量成员改变数据x其中没有意义。你说引用可以让你编辑一个const成员(这是永远不可能的)..

所以,如果你想创建一个const成员的引用,它必须是像你提到

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