c++ reference this rvalue-reference rvalue

c++ - ¿Es posible obtener la dirección del puntero ''this''?



reference rvalue-reference (4)

Me pregunto cuál puede dar la dirección de this ? ¿O ambos están equivocados?

Tampoco lo es la dirección de this , porque la máquina abstracta de C ++ no define una dirección para ello. this es como 0 No puede obtener la dirección de 0, no es una entidad con almacenamiento, solo algo de valor. Entonces que hace esto?

int const& i = 0;

Crea un objeto temporal, lo inicializa con 0 y, a continuación, le enlaza la referencia. Lo mismo ocurre exactamente en su código. Se crean referencias a diferentes objetos temporales que mantienen el valor de this .

this es una palabra clave que representa la dirección del objeto para el que se está ejecutando la función miembro. La máquina abstracta de C ++ no requiere que ocupe almacenamiento, por lo que siempre (lógicamente) es solo un valor simple, como 0.

Hay mérito para no requerir this para ocupar el almacenamiento. Permite que C ++ se implemente sobre una ABI donde this se pasa en un registro (algo que normalmente no es direccionable). Si &this tuviera que estar bien definido, es decir, si tuviera que ser direccionable, impediría que una implementación usara un registro para pasar la dirección. El estándar C ++ generalmente apunta a no atar implementaciones de esa manera.

Leí que this es un rvalor y no podemos obtener su dirección aplicando &this .

En mi código, he intentado usar un enlace de referencia para this . Me pregunto de qué manera va a dar la dirección de this ? O ambos están equivocados?

¿Qué es exactamente this ? ¿Un lvalue, un rvalue, una palabra clave o algo más?

void MyString::test_this() const{ std::cout << "this: " << this << std::endl; const MyString * const& this_ref = this; std::cout << "thie_ref: " << &this_ref << std::endl; const MyString * const&& this_right = this; std::cout << "thie_right: " << &this_right << std::endl; } //this: 00CFFC14 //thie_ref: 00CFFB14 //thie_right: 00CFFAFC


La palabra clave this comporta esencialmente como &__self donde __self es un lvalue que designa el objeto en el que se ejecuta la función miembro (el *this objeto) excepto que no se usa un operator&() sobrecargado operator&() .

Entonces, &this significaría &&__self que obviamente no tiene sentido, no puede tomar la dirección de una dirección, al igual que no puede tomar la dirección de un valor de retorno escalar de una función:

int fi(); int *fpi();

Tanto &(fi()) como &(fpi()) son ilegales, ya que el rvalue devuelto es un escalar (probablemente almacenado en un registro) y como un valor escalar puro no tiene una dirección .


Lo que se entiende por "no puedes tomar la dirección de this " es que no puedes escribir &this .

Usted está solicitando la dirección representada por this puntero, ¿verdad? Esto es, lo que hace tu primera salida.

this sí no se materializa como un puntero, como p MyString* x ej. MyString* x lo estaría. Aquí, x sí tiene una ubicación en la memoria y puedes hacer algo. como &x . Esto no es posible para this .

La respuesta a su última pregunta es: sí, this es una palabra clave. La expresión this es una expresión primaria. Puede leer sobre esto en la Sección [expr.prim.this] del estándar C ++.


this es un puntero que contiene la dirección al current object . No es una variable que se almacena en algún lugar (o incluso se puede cambiar), es una palabra clave especial con propiedades especiales.

Si desea saber la dirección del "objeto actual", simplemente puede mostrar como se muestra a continuación en el programa:

#include<iostream> using namespace std; class Test { public: void fun() { cout << "Address of this :: " << this << endl; void *ptr = this; cout << "Addrss of ptr :: " << ptr << endl; } }; int main() { Test obj; cout << "Address of obj :: " << &obj << endl; obj.fun(); return 0; }

El programa anterior produce una salida inferior:

Dirección de obj :: 0x7fffef913627

Dirección de este :: 0x7fffef913627

Addrss de ptr :: 0x7fffef913627

¡Espero que ayude!