繁体   English   中英

如果const reference延长了它的寿命,那么该右值在哪里?

[英]Where is this rvalue residing if its lifetime is prolonged by const reference?

我已经阅读了以下问题:

右值存储在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”的情况下,这是否意味着它确实获得了一些存储空间并且不是右值? 还是右值?

两者:这是一个右值,它有一个存储空间。 堆栈上有一个空间分配给存储空间 ,并且整数值为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类型的引用或指针,或者实际上指向易失性对象的非volatile类型的引用或指针。 通过非常量访问路径修改const对象,并通过非易失性glvalue引用volatile对象会导致未定义的行为

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM