【问题标题】:Extending the lifetime of a temporary value in C++延长 C++ 中临时值的生命周期
【发布时间】:2012-03-06 18:08:11
【问题描述】:
const int &ra=3;
  1. 据我所知,将 ra 设为 const 将延长临时 r 值的生命周期,在本例中为 3。这有点令人困惑,因为我知道 ra 应该具有相同的地址作为 r 值,这里是 3,但 3 不是真正的变量,它没有存储它的内存。那么这怎么可能呢?

  2. 有什么区别:

    const int& ra=a;
    

    int& const ra=a;
    

【问题讨论】:

  • 除了int& const ra=a; 不是有效的C++ 你的意思是......
  • @Addessamad - 编译器也可以处理const int a = 3;。这里没有太大区别。

标签: c++ reference temporary


【解决方案1】:

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

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


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

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

是第二个语句是非法的。

【讨论】:

  • @Nawaz:第一个问题。 int() 函数是否负责返回临时对象。像这样 int(3) 所以创建了一个临时对象
  • @Nawaz 以及为什么我们可以做到 const int &ra=3; 而不能 int &ra=3;
  • @AbdessamadBond:没有int() 功能。编译器创建临时对象,而不创建此类虚构函数。
  • int& const 甚至是合法的 C++ 吗?
  • @AbdessamadBond:语言定义了什么是有效的语法,什么不是,以及它的语义。它看起来像一个函数调用的事实并不意味着它是。
【解决方案2】:

1) 编译器是否决定实际存储您的号码3 是一个取决于优化决策的细节。就语言而言,临时对象与引用一样长。实际上,如果您只需要 value(而不是 object),则该对象可能永远不会被存储,而编译器可能会在您使用 @ 时直接替换该值987654322@。当然,如果您获取地址(通过&ra),那么编译器将确保一个对象实际上存储在某个地方,以便您可以获取它的地址。 (它仍然可以直接在别处替换该值,而不是从该地址加载它。)

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

【讨论】:

  • 以及为什么我们可以 const int &ra=3; 而不能 int &ra=3;
  • @Alecs:这只是语言的设计决定。修改临时对象在概念上几乎总是错误的,因此您只是不允许这样做。如果允许的话,人们会写出糟糕的代码。
【解决方案3】:

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

但是,在其范围之外引用该值将是一个关于它是否有效的问题,因此您不应将其用作“延长变量寿命”的一种方式。您可能会很幸运,并且将 const 分配在静态位置,因此您将始终获得所需的值,即使您在范围之外访问它也是如此;但是您可能会很不走运,最终会抓取超出您想要的临时值的数据。行为是“未定义的”——这意味着编译器决定了他们想要如何做,所以你无法指望。相反,通过提前声明变量或在堆上分配变量(int* x = malloc(sizeof(int))//, etc. 并传递其指针)来增加变量的范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2012-11-15
    • 2018-11-13
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    相关资源
    最近更新 更多