我尝试找到
this
指针的地址,但是这段代码显示了一个奇怪的
错误:
#include <iostream>
using namespace std;
class Base
{
public:
void test()
{
void *address_of_this =&this;
cout<<address_of_this<<endl;
}
};
int main()
{ Base k;
k.test();
return 0;
} //error non-lvalue in unary'&'
你能解释一下这个错误吗?
另请注意,获取
this
的地址有什么违法行为?
this
是一个包含“当前对象”地址的指针。它不是存储在某处(或者甚至可以更改)的变量,它是具有这些属性的特殊关键字。
因此,获取其地址是没有意义的。如果你想知道“当前对象”的地址,你可以简单地输出:
std::cout << this;
或存储为
void* a = this;
引用2003年C++标准:
5.1 [expr.prim] 关键字
命名一个指向调用非静态成员函数 (9.3.2) 的对象的指针。 ...表达式的类型是指向函数类的指针 (9.3.2),...表达式是右值。this
5.3.1 [expr.unary.op] 一元
运算符的结果是指向其操作数的指针。操作数应为左值或qualified_id。&
简单来说,
&
需要一个左值。正如错误消息所示,this
是右值,而不是左值。
this
使用地址来引用 current 对象。
在您的问题中,有两个错误:
this
不是左值。
&
需要一个左值。 左值是那些可以出现在赋值左侧的值(变量、数组等)。
而
this
是一个 rvalue。 右值不能出现在左侧(加法、减法等)。
参考:C++ 右值引用解释。
一个隐藏错误是:
address_of_this
实际上是在接收一个地址的地址。
基本上,
&this
被翻译成&&object
或&(&object)
之类的东西。 基本上,将
this
视为 &object
(但只需记住,因为事实并非如此)。
this
是纯右值。
换句话说,它是在需要时动态计算的,否则不存储在内存中。因此它没有持久的地址/位置供您使用。