2012-02-02 12 views
9

cerco di trovare l'indirizzo di this puntatore, ma questo codice sta mostrando una strana errore:indirizzo di questo

#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'&' 

Può spiegare questo errore?
Indicare anche ciò che è illegale nel prendere l'indirizzo di this?

+0

Prova ad aggiungere uno spazio dopo il segno = – Alexander

risposta

20

this è un puntatore contenente l'indirizzo "oggetto corrente". Non è una variabile che viene memorizzata da qualche parte (o potrebbe anche essere modificata), è una parola chiave speciale con queste proprietà.

Come tale, prendere il suo indirizzo non ha senso. Se si vuole conoscere l'indirizzo dell ' "oggetto corrente" si può semplicemente uscita:

std::cout << this; 

o negozio come

void* a = this; 
+2

Infine .. la voce della ragione. – Mankarse

+6

In standardese: 'this' è un valore di rvalue (e non di classe), quindi non ha un indirizzo. –

+0

Di nuovo in Standard, 'this' è _provalue_ - _pure-rvalue_. – Xupicor

7

Citando lo standard 2003 C++:

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.

Per mettere semplicemente, & richiede un lvalue. this è un valore di rvalore, non un lvalue, proprio come indica il messaggio di errore.