地址

时间:2012-02-02 15:26:35

标签: c++ pointers this

我试图找到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 个答案:

答案 0 :(得分:32)

this是一个包含“当前对象”地址的指针。它不是存储在某处(或甚至可以更改)的变量,它是具有这些属性的特殊关键字。

因此,取其地址毫无意义。如果您想知道“当前对象”的地址,您只需输出:

std::cout << this;

或存储为

void* a = this;

答案 1 :(得分:8)

引用2003 C ++标准:

  

5.1 [expr.prim]关键字this命名一个指向调用非静态成员函数(9.3.2)的对象的指针。 ...表达式的类型是指向函数类的指针(9.3.2),...表达式是一个右值。

     

5.3.1 [expr.unary.op]一元&运算符的结果是指向其操作数的指针。操作数应为左值或 qualified_id

简而言之,&需要一个左值。 this是一个右值,而不是左值,正如错误消息所示。

答案 2 :(得分:0)

this通过使用其地址引用当前对象。

在您遇到的问题中,有两个 错误:

  • this不是左值

    &需要一个左值左值是可以出现在赋值(变量,数组等)左侧的那些。

    this rvalue rvalue 不能出现在左侧(加法,减法等)。

    参考:C++ Rvalue References Explained

  • 一个我想提及的隐藏错误是:

    address_of_this实际上正在接收地址中的一个地址。

    基本上,&this被翻译成&&object&(&object)之类的东西。

基本上,将this视为&object(但要记住是因为它不是真的)。​​