有一个临时或字面意思是否有必要拥有rvalue
Is it necessary to have a temporary or a literal to have an rvalue?
这个问题询问所有临时性是否均为rvalue。
答案是否定的,因为如果我们考虑此表达式:
const int &ri = 2 + 3;
然后,可以使用相同的临时(2 + 3)
,这是一个rvalue作为后续表达式中的lvalue:
const int *pi = &ri;
所以这个临时性不是(仅)rvalue。
logic语句temporary ==> rvalue
然后是错误的。
但是,我们不能写
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有临时还是字面意思?rvalue ==> (temporary or literal)
是真的吗?
产生临时对象的表达是 r-values。有一个特殊的规则,该规则允许构成引用和R值引用绑定到R值,这将临时对象的寿命扩展到参考的寿命(请参阅12.2(5)),但这并不能使临时性。 - 对象表达式少于R值。
然而,一旦绑定到参考,参考变量本身就有一个名称,因此参考表达式为l值。
不要混淆表达式,变量和对象。
rvalue 和 lvalue 属性适用于表达式,而不是 objects 。表达式可以是 lvalue 或 rvalue 。过度简化产生值的表达式是 rvalue-excression ,而产生对象的表达式为 lvalue-expression 。 lvalue to to rvalue 转换是读取的行为。
。产生临时和文字的表达式都是 rvalue-expressions 它们代表a value 不是实际对象。
在您的示例中:
const int &ri = 2 + 3;
const int *pi = &ri;
表达式2+3
是用于初始化常数参考的 rvalue-expression 。根据该语言,这意味着临时寿命的延长超出了当前表达式,直到引用不范围为止。之后,在第二个表达式中,子表达 ri
是指的 lvalue-expression ,它是指临时对象的寿命已延长。
请注意,还有其他方法可以使用临时性创建 rvalue表达式,例如调用产生参考的成员:
struct test {
test& thisTest() { return *this; }
};
test foo();
... foo().thisTest()
亚表达foo()
是 rvalue-expression ,但表达式 foo().thisTest()
是 lvalue-expression 。他们俩都指在完整表达结束时消失的临时对象。
- 在提升multi_index容器中,是否定义了"default index"?
- 对RValue对象调用的LValue ref限定成员函数
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 如果没有带有函数签名的 rvalue 参数,是否会执行 C++ 11 中的移动语义?
- C++标准是否保证失败的插入到关联容器中不会修改 rvalue-reference 参数?
- 是转发参考是否仍然是RVALUE参考
- 是否可以调用将const rvalue作为参数的函数
- 是否有一种方法可以避免在RVALUE和LVALUE参考中创建功能时避免重复的代码
- 函数返回rvalue参考是否有意义
- RValue 引用在将其绑定(非指针)对象分配给另一个指针后是否会删除该对象?
- 是否有某种功能,指针取消给出了rvalue
- Lvalue和Literal之间的比较是否调用Lvalue到Rvalue的转换
- 是否有任何理由将返回值捕获为rvalue参考
- 有一个临时或字面意思是否有必要拥有rvalue
- 模板是否应该为不同类型的参数制作非 Rvalue 引用构造函数/赋值
- 声明 RValue 方法(例如 void operation() 和 &;) 虚拟 C++1x )是否有意义