c++ - 是否必须有一个临时的或文字的右值?

标签 c++ temporary rvalue

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/

相关文章:

python - Boost Python用默认参数包装静态成员函数重载

c++ - VS2010 中的 Qt - 无法使用设计器创建的对象

database - session 是否比查询数据库更快?

c++ - 为什么 as_const 禁止右值参数?

c++ - 如何恢复linux当前所有进程

c++ - 安全转换为 const char * - 临时生命周期问题

c++ - 在单个语句中将临时字符串流转换为 c_str()

c++ - 右值保证了什么样的优化?

c++0x 隐式转换为非标量类型

c++ - 异常处理——它离开 catch 后会发生什么