问题
I try to find address of this pointer, but this code is showing a strange
error:
#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'&'
Can you explain this error ?
Also point that what is illegal in taking address of this?
回答1:
this is a pointer containing the address to the "current object". It is not a variable that is stored somewhere (or could even be changed), it is a special keyword with these properties.
As such, taking its address makes no sense. If you want to know the address of the "current object" you can simply output:
std::cout << this;
or store as
void* a = this;
回答2:
Quoting the 2003 C++ standard:
5.1 [expr.prim] The keyword
thisnames a pointer to the object for which a nonstatic member function (9.3.2) is invoked. ... The type of the expression is a pointer to the function’s class (9.3.2), ... The expression is an rvalue.5.3.1 [expr.unary.op] The result of the unary
&operator is a pointer to its operand. The operand shall be an lvalue or a qualified_id.
To put it simply, & requires an lvalue. this is an rvalue, not an lvalue, just as the error message indicates.
回答3:
this refers to the current object by using it's address.
In your problem, there are two errors:
thisis not an lvalue.The
&requires an lvalue. lvalues are those that can appear on on the left-hand side of an assignment (variables, arrays, etc.).Whereas
thisis a rvalue. rvalues can not appear on the left-hand side (addition, subtraction, etc.).Reference: C++ Rvalue References Explained.
A hidden error which I'd like to also mention is thus:
address_of_thisis actually receiving an address of an address.Basically,
&thisis translated into something like&&objector&(&object).
Basically, think of this as &object (but only to remember because it is not that true).
来源:https://stackoverflow.com/questions/9114930/address-of-this