Можно ли получить адрес указателя this? - PullRequest
15 голосов
/ 01 июля 2019

Я прочитал, что this является значением, и мы не можем получить его адрес, применив &this.

В моем коде я попытался использовать ссылку на привязку к this. Мне интересно, в какую сторону даст адрес this? Или оба не правы?

Что именно является this? Lvalue, rvalue, ключевое слово или что-то еще?

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

Ответы [ 4 ]

21 голосов
/ 01 июля 2019

Мне интересно, что может дать адрес this?Или оба неверны?

Также не указан адрес this, потому что абстрактная машина C ++ не определяет для него адрес.this похоже на 0.Вы не можете получить адрес 0, это не сущность с хранилищем, просто какое-то значение.Так что же это делает?

int const& i = 0;

Он создает временный объект, инициализирует его с 0, а затем привязывает ссылку на него.То же самое происходит с вашим кодом.Вы создаете ссылки на различные временные объекты, которые содержат значение из this.

this - это ключевое слово, обозначающее адрес объекта, для которого выполняется функция-член,Абстрактная машина C ++ не требует, чтобы она занимала хранилище, поэтому всегда (логически) это просто простое значение, например 0.

Есть смысл не требовать this, чтобы занимать хранилище.Это позволяет реализовать C ++ через ABI, где this передается в регистр (что обычно не адресуемо).Если &this должен быть четко определен, то есть если this должен быть адресуемым, это помешает реализации использовать регистр для передачи адреса.Стандарт C ++, как правило, направлен на то, чтобы не связывать реализации таким образом.

8 голосов
/ 01 июля 2019

Что означает "вы не можете взять адрес this", так это то, что вы не можете написать &this.

Вы запрашиваете адрес , представленный указателем this, верно? Это то, что делает ваш первый вывод.

this сам по себе не материализуется как указатель, как, например, MyString* x будет. Здесь x сам имеет место в памяти, и вы можете сделать что-нибудь. как &x. Это невозможно для this.

Ответ на ваш последний вопрос: да, this - это ключевое слово. Выражение this является основным выражением. Вы можете прочитать об этом в разделе [expr.prim.this] стандарта C ++.

4 голосов
/ 01 июля 2019

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

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

#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;
 }

Приведенная выше программа выдает следующие выходные данные:

Адрес obj :: 0x7fffef913627

Адрес этого :: 0x7fffef913627

Адрес ptr :: 0x7fffef913627

Надеюсь, это поможет!

2 голосов
/ 01 июля 2019

Ключевое слово this ведет себя как &__self, где __self - это l-значение, обозначающее объект, для которого выполняется функция-член (объект *this), за исключением того, что перегруженный operator&() не используется.

Так что &this будет означать &&__self, что, очевидно, не имеет смысла, вы не можете взять адрес адреса, так же, как вы не можете взять адрес скалярного возвращаемого значения функции:

int fi(); 
int *fpi(); 

И &(fi()), и &(fpi()) недопустимы, поскольку возвращаемое значение является скаляром (вероятно, хранится в регистре), а как чистое скалярное значение не имеет адреса .

...