Mar*_*ork 35
不.无法获取引用的地址.
这是因为引用不是对象,它是别名(这意味着它是对象的另一个名称).
int x = 5;
int& y = x;
std::cout << &x << " : " << &y << "\n";
Run Code Online (Sandbox Code Playgroud)
这将打印出相同的地址.
这是因为'y'只是对象'x'的另一个名称(别名).
Pot*_*ter 22
ISO标准说得最好:
不应引用引用,不引用引用数组,也不引用引用指针.
我不喜欢很多人在这里使用的逻辑,你不能这样做,因为引用不是"保证只是某个地方的指针".正如int x可能只是一个没有地址的处理器寄存器,但在& x使用时神奇地成为存储器位置,编译器仍然可以允许你想要的东西.
在过去,许多编译器确实允许你所要求的,例如
int x, y;
int &r = x;
&r = &y; // use address as an lvalue; assign a new referent
Run Code Online (Sandbox Code Playgroud)
我刚检查过,GCC会编译它,但是有一个措辞强烈的警告,结果程序坏了.
AnT*_*AnT 12
没有.
正如Bjarne Stroustrup在TC++ PL中所说,引用可以被认为是现有实体(对象或函数)的另一个名称.虽然这并不总是对实现引用的底层低级机制的最精确描述,但它是对引用在语言级别实现的概念的非常好的描述.毫不奇怪,该语言无法获得引用本身的地址.
在语言级别,不保证引用占用存储位置,因此通常情况下它没有地址.
小智 9
从同一个问题的另一个例子:$ 8.3.2/3 - "未指明引用是否需要存储(3.7).".
因此,C++标准允许编译器/运行时实现者选择引用是否位于单独的内存位置.但请注意,如果它确实存在于单独的内存位置,则无法以符合标准的方式找到其地址.所以不要这样做.
如果您按照C++标准的定义获取引用的地址,您将获得它所引用的地址,而不是引用的地址,如果事实上该引用甚至作为运行时环境中的单独实体存在或不.
只需使用'&'运算符即可.例如:
int x = 3;
int &y = x;
cout<<&y<<endl;
Run Code Online (Sandbox Code Playgroud)
这将返回x的地址,因为y只不过是x的地址.
| 归档时间: |
|
| 查看次数: |
42355 次 |
| 最近记录: |