This question询问是否所有临时对象都是右值。
答案是否定的,因为如果我们考虑这个表达式:
const int &ri = 2 + 3;
然后,可以使用完全相同的临时 (2 + 3)
,这里是一个右值
作为后续表达式中的左值:
const int *pi = &ri;
所以这个临时值不是(仅)右值。
逻辑语句 temporary ==> rvalue
则为 false。
但是,我们不能写
const int &ri = &(2 + 3); // illegal, 2 + 3 -> temporary -> rvalue
或
int *i = &4; // illegal, 4 is an rvalue (literal)
或
int foo();
int *i = &foo(); // illegal, foo() -> temporary -> rvalue
因此我的问题是,我们是否可以在某个表达式中生成一个右值而不用
有临时的还是文字的? rvalue ==> (temporary or literal)
是真的吗?
最佳答案
产生临时对象的表达式是右值。有一个特殊的规则允许 const-references 和 r-value references 绑定(bind)到 r-values,这将临时对象的生命周期延长到引用的生命周期(参见 12.2(5)),但这不会使临时对象- 对象表达式少了一个右值。
但是,一旦绑定(bind)到引用,引用变量本身就有了名称,因此引用表达式是左值。
不要混淆表达式、变量和对象。
关于c++ - 是否必须有一个临时的或文字的右值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13205043/