我试图找到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
的地址中有什么违法行为?
答案 0 :(得分:32)
this
是一个包含“当前对象”地址的指针。它不是存储在某处(或甚至可以更改)的变量,它是具有这些属性的特殊关键字。
因此,取其地址毫无意义。如果您想知道“当前对象”的地址,您只需输出:
std::cout << this;
或存储为
void* a = this;
答案 1 :(得分:8)
引用2003 C ++标准:
5.1 [expr.prim]关键字
this
命名一个指向调用非静态成员函数(9.3.2)的对象的指针。 ...表达式的类型是指向函数类的指针(9.3.2),...表达式是一个右值。5.3.1 [expr.unary.op]一元
&
运算符的结果是指向其操作数的指针。操作数应为左值或 qualified_id 。
简而言之,&
需要一个左值。 this
是一个右值,而不是左值,正如错误消息所示。
答案 2 :(得分:0)
this
通过使用其地址引用当前对象。
在您遇到的问题中,有两个 错误:
this
是不是左值 。
&
需要一个左值。 左值是可以出现在赋值(变量,数组等)左侧的那些。
this
是 rvalue 。 rvalue 不能出现在左侧(加法,减法等)。
一个我想提及的隐藏错误是:
address_of_this
实际上正在接收地址中的一个地址。
基本上,&this
被翻译成&&object
或&(&object)
之类的东西。
基本上,将this
视为&object
(但要记住是因为它不是真的)。