我已经阅读了以下问题:

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
}


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

我也想知道我所做的是否是未定义的行为,而不管const_cast是不可取的还是其他原因。

最佳答案

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


通常它有一个存储空间,您应该在这里误解了一些概念。


  在分配给数字文字“ 3”的情况下,这是否意味着它确实获得了一些存储空间并且不是右值?还是右值?


两者:这是一个右值,它有一个存储空间。堆栈上有分配给存储的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对象
  访问路径并通过非易失性引用易失性对象
  glvalue导致未定义的行为。

关于c++ - 如果const reference延长了它的生命周期,那么该右值在哪里?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48476813/

10-11 22:54
查看更多