c++ - 将左值引用绑定(bind)到右值引用?

标签 c++ reference forward lvalue rvalue

我试过编译:

int &&a=3;
int &b=a;

并且有效。 我知道“a”是左值,但为什么我可以将“对 int 的右值引用”绑定(bind)到“对 int 的左值引用(而不是对 int 的右值引用)”? 这样,我可以更改临时值 3:

b=5 //changing the value of the temporary bound to the rvalue reference

这个技术是从 std::forward 使用的,所以我想这是一个标准行为。 对 int 的右值引用是否被视为存储临时值的简单 int 左值? 如果不是,您如何解释绑定(bind)?

最佳答案

引用不绑定(bind)到其他引用;它们绑定(bind)到对象。

当您从3 初始化a 时,您创建了一个新的临时int 对象whose lifetime is extended . b 只是对该对象的另一个引用。

请注意,a 一个左值,因为它是一个命名对象的表达式,即使它具有类型“右值引用” 整数”!注意不要将类型值类别混淆,这里:类型与对象相关,但值类别与表达式相关(即使这些表达式名称或以其他方式评估某个对象)。

当您考虑时,这些令人困惑的规则都非常巧妙地组合在一起:要使原始引用有效,对象的生命周期必须已经延长,因此 b 的初始化是安全的。

关于c++ - 将左值引用绑定(bind)到右值引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25705797/

相关文章:

c++ - 未定义对 `i2c_smbus_read_block_data(int, unsigned char, unsigned char*)'的引用

c++ - 在给定值处创建溢出

c++ - 此处不允许在 '{' 之前定义函数

reference - 循环变量之前 `&`的作用是什么?

c++ - 常量之间的区别。指针和引用?

C++ 神秘结构赋值与 int 截断

c++ - *&var 是多余的吗?

java - 我如何在 Tomcat Servlet 中打印一些东西, hibernate 3 秒然后转发到另一个 servlet?

servlets - java.lang.IllegalStateException:提交响应后无法(转发| sendRedirect |创建 session )

jquery - 交响乐团 : How to redirect to a new page in an AJAX call?