似乎有许多关于指针与参考的相关问题,但我找不到我想知道的东西.基本上,一个对象通过引用传入:
funcA(MyObject &objRef) { ... }
Run Code Online (Sandbox Code Playgroud)
在函数中,我可以获得指向该对象而不是引用的指针吗?如果我将引用objRef视为别名MyObject,&objRef实际上会给我一个指向MyObject的指针吗?这似乎不太可能.我很迷惑.
编辑:经过仔细检查,objRef确实给了我指向我需要的对象的指针 - 大多数人给了我正确的信息/答案,非常感谢.在这种情况下,我提出了似乎最具说明性的答案.
Pra*_*ian 93
是的,将address-of运算符应用于引用与获取原始对象的地址相同.
#include <iostream>
struct foo {};
void bar( const foo& obj )
{
std::cout << &obj << std::endl;
}
int main()
{
foo obj;
std::cout << &obj << std::endl;
bar( obj );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果:
0x22ff1f
0x22ff1f
Run Code Online (Sandbox Code Playgroud)
Jos*_*eld 33
应用于引用的任何运算符实际上将应用于它引用的对象(§5/ 5 [expr]); 引用可以被认为是同一对象的另一个名称.因此,获取引用的地址将为您提供它所引用的对象的地址.
实际上未指定引用是否需要存储(§8.3.2/ 4 [dcl.ref]),因此获取引用本身的地址是没有意义的.
举个例子:
int x = 5;
int& y = x;
int* xp = &x;
int* yp = &y;
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,xp它yp是相等的 - 也就是说,表达式的xp == yp计算结果是true因为它们都指向同一个对象.
Ker*_* SB 25
一般的解决方案是使用std::addressof,如:
#include <type_traits>
void foo(T & x)
{
T * p = std::addressof(x);
}
Run Code Online (Sandbox Code Playgroud)
无论是否T重载,这都有效operator&.
&在引用上使用address-of()运算符.
&objRef
Run Code Online (Sandbox Code Playgroud)
与引用中使用的任何其他运算符一样,这实际上会影响引用的对象.
正如@Kerrek指出的那样,由于运算符会影响引用的对象,如果该对象具有重载operator&函数,则会调用它std::address_of来获取真实地址.