如果rvalue的生命周期被const引用延长,那么这个rvalue在哪里?

时间:2018-01-27 14:33:03

标签: c++ const rvalue-reference

我已经阅读了这个问题:

Where is rvalue stored in C

根据答案:

int main()
{
    int a = 7; // 7 rvalue is stored in the program binary and assigned to "a"
    int b = 7 * rand(); // 7 is pulled from the program binary, multiplied by result of rand and assigned to "b"

    // But...
    const int& c = 3; // 3 is an rvalue?
    const_cast<int&>(c) = 1; // rvalues don't have storage space? But I'm assigning to it.
    std::cout << c; // Prints 1
}

我想理解,通常rvalue临时(等号的右侧)在内存中没有存储空间,其生命周期在行尾结束。如果我们将const引用绑定到它,那么它将rvalue的生命周期延长到它绑定的引用的生命周期。在分配给“3”,数字文字的情况下,这是否意味着它确实获得了一些存储空间并且不是右值?或者是一个右值?

此外,我想知道我所做的是未定义的行为,无论const_cast是不可取的还是其他什么。

1 个答案:

答案 0 :(得分:3)

  

通常rvalue临时(等号的右侧)在内存中没有存储空间

通常它有一个存储空间,你应该误解一些概念。

  

如果要分配给&#34; 3&#34;,一个数字文字,这是否意味着它确实获得了一些存储空间并且不是一个右值?或者是一个右值?

两者:它是一个右值,它有一个存储空间。堆栈上有a space,分配给存储,整数值为3,然后c绑定到此变量。

关于您的代码:

const int& c = 3; // 3 is an rvalue?

是的,它是右值。

const_cast<int&>(c) = 1; // rvalues don't have storage space? But I'm assigning to it.
std::cout << c; // Prints 1

来自const_cast

  

const_cast使得可以形成一个引用或指针   非const类型实际上是指一个const对象或一个   引用或指向实际引用的非易失性类型   一个易变的对象。 通过非const修改const对象   访问路径并通过非易失性引用volatile对象   glvalue 导致未定义的行为