2015-11-12 3 views
3

Я знаю, что указатель this неявно передается членам-членам при их вызове. Когда я пытаюсь получить адрес указателя this (через &this), я получаю ошибку компилятора «lvalue required». Почему это?Почему я получаю сообщение об ошибке при использовании & this?

class st 
{  
    int a,b; 
public : 
    void print() 
    {  
    cout << &this; //gives lvalue required... why? 

    cout << this; //will print address of object. 
    } 
} 
+0

Итак, какая часть сообщения об ошибке вы не понимаете? – Brian

+0

Если вы определили 'st * ptr = new st;' и хотите распечатать адрес вновь выделенного объекта, вы должны использовать 'std :: cout << ptr;', правильно? '& ptr', очевидно, неверно. Почему «это» будет другим? – rici

ответ

5

this не lvalue, а prvalue. Из [class.this]:

В теле функции члена нестатический (9.3), ключевое слово это выражение prvalue, значение которого является адрес объекта, для которого вызывается функция , Тип этого в членной функции класса X есть X *. Если функция-член объявлена ​​const, тип этого - const X *, если функция-член объявлена ​​изменчивой, тип этого является изменчивым X *, и если функция-член объявлена ​​const volatile, тип этого const изменчивый X *.

Упор шахта

& требует lvalue, так что вы не можете получить адрес this.

+0

, но мой вопрос заключается в том, почему мы не можем использовать, поскольку это внутренне рассматривается как «class_name * const this», поэтому почему я не могу использовать & с этим? –

+0

потому что '&' нуждается в 'lvalue', и' this' не является 'lvalue' – NathanOliver

+0

. Я понял, что это prvalue, но что это значит, можете ли вы рассказать мне? –

-1

Предположительно вы пытаетесь распечатать значения в объекте. cout не знает, как это сделать, и вы должны учить его. cout < < * это; мог бы сделать это, если бы cout знал, как это сделать, но вы можете научить его. Вот пример, более естественный C++. (Вы также должны рассмотреть конструктор).

#include <iostream> 
    using namespace std; 
    class st 
    { 
     public: 
     int a,b; 
    }; 
    std::ostream& operator<<(std::ostream& s, const st& val) 
    { 
     return s << "a:" << val.a << " b:" << val.b ; 
    } 
    int main() { 
     st foo; 
     foo.a = 1; 
     foo.b = 2; 
     cout << "foo is " << foo << endl; 
    } 
+0

Он пытается 'cout & this', а не' cout * this', и он знает, что он пытается сделать . –

+0

Я пытался понять его намерение. Как отмечали другие, его намерение неясно. Я думаю, он хочет распечатать значения в объекте. Он отклоняется от обсуждения того, что такое указатель, и я не думаю, что это то, что нужно. Возможно, я ошибаюсь. Иногда, когда вы помогаете людям, хорошо видеть прошлый вопрос и пытаться понять, что они пытаются сделать. – Redwood

0

Поскольку этот указатель является значением rvalue. этот указатель является постоянным значением, он передается функции-члену, такой как локальная переменная, поэтому значение сохраняется в ячейке памяти, которая становится недействительной при возврате из этой функции.

Смежные вопросы