右值引用转换后的地址更改
address changes after a rvalue reference conversion
#include <iostream>
using namespace std;
int main()
{
int i = 0;
cout << &i << endl;
const auto &ref = (short&&)i;
cout << &ref << endl;
return 0;
}
为什么&i
与&ref
不同?(short&)i
不会导致此问题。(short&&)i
生成临时变量吗?
这是因为您正在做不同类型的演员表。C 样式显式转换强制转换始终执行静态强制转换,如果它可以解释为静态转换;否则,它会重新解释演员表。和/或根据需要进行常量转换。
(short&&)i
是静态强制转换,因为它可以解释为static_cast<short&&>(i)
。它创建一个临时short
对象,ref
绑定到该对象。作为一个不同的对象,它有一个不同的地址。
(short&)i
是重新解释演员表,因为它不能被解释为static_cast<short&>(i)
格式不正确。它将 int 引用重新解释为短引用,并且ref
绑定到同一对象。请注意,通过此引用访问对象将具有未定义的行为。
这将创建对存在的事物的左值引用:
const auto& ref = i;
因此,表达式&ref
和&i
将给出相同的结果。
这也适用于:
const auto& ref = (int&)i;
这基本上是一回事。
但是,强制转换为不是对T
的左值引用(因此,转换为值或其他类型的右值引用!(必须创建一个临时;当绑定到ref
时,此临时会经历生存期延长。但是现在ref
不"引用"i
,所以地址结果会有所不同。
它实际上比这复杂一些,但你明白了。此外,不要这样编写代码!int
不是short
,你不能假装它是。
显然它创建了一个临时的。
实际上编译器会告诉你自己。 试试这个:
auto &ref = (short&&)i;
cout << &ref << endl;
错误说:
错误:对类型"short"的非常量左值引用无法绑定到 "短"类型的临时
在此处测试代码。
(short&&)i
创建一个临时对象,因此您获取其他对象的地址,因此地址可能会有所不同。
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 如何从绝对地址的 C 样式指针创建对C++对象的引用
- 右值引用转换后的地址更改
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 获取通用/前向引用地址有什么意义?
- 按引用传递和按地址传递之间的差异
- C++ / Qt:如何检测主机名或IP地址何时引用当前系统?
- 常量引用函数参数的地址何时唯一?
- 通过引用传递是否涉及复制地址
- 总是引用的地址等于源地址
- 在函数中传递变量的指针和引用/地址
- 为什么取消引用的指针指向指针的 std::cout 会导致 -fsanitize=地址投诉?
- 如何通过引用获取引用变量的地址?
- 取消引用地址时是否可以重定向到其他地址?
- 在 C++ 03 中,如何引用一个被煽动的模板函数的地址
- 取消引用的输入迭代器的地址?istream_iterator的情况
- 赋值不起作用,但带有取消引用运算符的地址起作用?
- 变量循环范围会导致返回局部变量的地址引用
- 使用cout,如何将char转换为变量的地址/引用(?)
- 为什么函数不能更改其参数对象的地址/引用值?