在C ++中延长临时值的生命周期

时间:2012-03-06 18:08:11

标签: c++ reference temporary

const int &ra=3;
  1. 据我所知,使ra const会延长临时r值的生命周期,在这种情况下为3.这有点令人困惑,因为我知道ra应该具有与此处为3的r值相同的地址,但是3不是实数变量,并且它没有存储它的存储器。那怎么可能呢?

  2. 有什么区别:

    const int& ra=a;
    

    int& const ra=a;
    

3 个答案:

答案 0 :(得分:12)

  

但是3不是真正的变量,它没有存储它的存储器。那怎么可能呢?

实际上,临时对象是从文字3创建的,然后该临时对象绑定到const引用。这就是它的可能性。


现在你的下一个问题:这两者之间的区别

const int& ra=a;
int& const ra=a;

是第二个陈述是非法的。

答案 1 :(得分:8)

1)编译器是否决定实际存储您的号码3是一个受优化决策约束的细节。就语言而言,临时对象与引用一样长。实际上,如果您只需要(而不是对象),则根本不会存储该对象,而是编译器可以在您使用{时直接替换该值{1}}。当然,如果你获取地址(通过ra),那么编译器将确保一个对象实际存储在某个地方,以便你可以获取它的地址。 (它可能仍然直接在其他地方替换该值,而不是从该地址加载它。)

2)第二个版本无效C ++。您只能说&raint const & x,原因与const int & xint const表示相同类型的原因相同。引用本身没有恒定的概念;它始终绑定到初始化它的对象(即,您不能拥有“裸”引用对象 const int )。

答案 2 :(得分:0)

根据我的理解,当你创建一个变量const时,它会分配一个存储它的内存,就像任何其他变量一样。根据编译器的不同,如果将const 3放在一个函数中,它可能会在每次调用函数时分配一个temp 3,或者它可能只引用程序启动时分配的静态值。这是一个真正的变量,因为它的数据存储在某处,就像其他变量一样。

但是,在其范围之外引用该值将是一个关于它是否会起作用的结论,因此您不应该将其用作“延长变量的生命周期”的方法。你可能会很幸运,并且const会被分配到一个静态的地方,所以你总能获得你想要的值,即使你在范围之外访问它也是如此;但是你可能会感到不幸,并最终抓住写在你想要的临时值上的数据。行为是“未定义的” - 这意味着编译器决定他们想要怎么做,所以你无法依靠它。相反,通过先声明它来增加变量的范围,或者在堆上分配它(int* x = malloc(sizeof(int))//, etc.并传递它的指针。