адрес этого - PullRequest
       11

адрес этого

11 голосов
/ 02 февраля 2012

Я пытаюсь найти адрес указателя 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?

Ответы [ 3 ]

32 голосов
/ 02 февраля 2012

this - указатель, содержащий адрес «текущего объекта». Это не переменная, которая где-то хранится (или даже может быть изменена), это специальное ключевое слово с этими свойствами.

Таким образом, брать его адрес не имеет смысла. Если вы хотите узнать адрес «текущего объекта», вы можете просто вывести:

std::cout << this;

или хранить как

void* a = this;
8 голосов
/ 02 февраля 2012

Цитирование стандарта C ++ 2003:

5.1 [expr.prim] Ключевое слово this указывает указатель на объект, для которого вызывается нестатическая функция-член (9.3.2). ... Тип выражения является указателем на класс функции (9.3.2), ... Выражение является значением r.

5.3.1 [expr.unary.op] Результатом унарного оператора & является указатель на его операнд. Операнд должен быть lvalue или qual_id .

Проще говоря, & требует lvalue. this - это r-значение, а не l-значение, как указывает сообщение об ошибке.

0 голосов
/ 23 июня 2018

this ссылается на текущий объект, используя его адрес.

В вашей проблеме две ошибки:

  • this - это , а не lvalue .

    & требует lvalue . lvalue s - это те, которые могут отображаться в левой части назначения (переменные, массивы и т. Д.).

    Принимая во внимание, что this является rvalue . rvalue s не может отображаться с левой стороны (сложение, вычитание и т. Д.).

    Ссылка: Объяснение C ++ Rvalue Ссылки .

  • A скрытая ошибка, о которой я хотел бы также упомянуть:

    address_of_this фактически получает адрес адреса.

    По сути, &this переводится в нечто вроде &&object или &(&object).

В общем, думайте о this как о &object (но только чтобы запомнить, потому что это не так).

...