const int &ra=3;
据我所知,使ra
const会延长临时r值的生命周期,在这种情况下为3.这有点令人困惑,因为我知道ra
应该具有与此处为3的r值相同的地址,但是3不是实数变量,并且它没有存储它的存储器。那怎么可能呢?
有什么区别:
const int& ra=a;
和
int& const ra=a;
答案 0 :(得分:12)
但是3不是真正的变量,它没有存储它的存储器。那怎么可能呢?
实际上,临时对象是从文字3
创建的,然后该临时对象绑定到const引用。这就是它的可能性。
现在你的下一个问题:这两者之间的区别
const int& ra=a;
int& const ra=a;
是第二个陈述是非法的。
答案 1 :(得分:8)
1)编译器是否决定实际存储您的号码3
是一个受优化决策约束的细节。就语言而言,临时对象与引用一样长。实际上,如果您只需要值(而不是对象),则根本不会存储该对象,而是编译器可以在您使用{时直接替换该值{1}}。当然,如果你获取地址(通过ra
),那么编译器将确保一个对象实际存储在某个地方,以便你可以获取它的地址。 (它可能仍然直接在其他地方替换该值,而不是从该地址加载它。)
2)第二个版本无效C ++。您只能说&ra
和int const & x
,原因与const int & x
和int const
表示相同类型的原因相同。引用本身没有恒定的概念;它始终绑定到初始化它的对象(即,您不能拥有“裸”引用对象 )。const int
答案 2 :(得分:0)
根据我的理解,当你创建一个变量const时,它会分配一个存储它的内存,就像任何其他变量一样。根据编译器的不同,如果将const 3放在一个函数中,它可能会在每次调用函数时分配一个temp 3,或者它可能只引用程序启动时分配的静态值。这是一个真正的变量,因为它的数据存储在某处,就像其他变量一样。
但是,在其范围之外引用该值将是一个关于它是否会起作用的结论,因此您不应该将其用作“延长变量的生命周期”的方法。你可能会很幸运,并且const会被分配到一个静态的地方,所以你总能获得你想要的值,即使你在范围之外访问它也是如此;但是你可能会感到不幸,并最终抓住写在你想要的临时值上的数据。行为是“未定义的” - 这意味着编译器决定他们想要怎么做,所以你无法依靠它。相反,通过先声明它来增加变量的范围,或者在堆上分配它(int* x = malloc(sizeof(int))//, etc.
并传递它的指针。