18

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?

sehe
  • 374,641
  • 47
  • 450
  • 633
T.J.
  • 1,466
  • 3
  • 19
  • 35

3 Answers3

43

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;
PlasmaHH
  • 15,673
  • 5
  • 44
  • 57
8

Quoting the 2003 C++ standard:

5.1 [expr.prim] The keyword this names 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.

Community
  • 1
  • 1
Robᵩ
  • 163,533
  • 20
  • 239
  • 308
0

this refers to the current object by using it's address.

In your problem, there are two errors:

  • this is 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 this is 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_this is actually receiving an address of an address.

    Basically, &this is translated into something like &&object or &(&object).

Basically, think of this as &object (but only to remember because it is not that true).

Ed The ''Pro''
  • 875
  • 10
  • 22