我已经阅读了以下问题:
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/