我已经阅读了这个问题:
根据答案:
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是不可取的还是其他什么。
答案 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 导致未定义的行为。