这个地址

问题描述 投票:0回答:4

我尝试找到

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
的地址有什么违法行为?

c++ pointers this
4个回答
43
投票

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

因此,获取其地址是没有意义的。如果你想知道“当前对象”的地址,你可以简单地输出:

std::cout << this;

或存储为

void* a = this;

8
投票

引用2003年C++标准:

5.1 [expr.prim] 关键字

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

5.3.1 [expr.unary.op] 一元

&
运算符的结果是指向其操作数的指针。操作数应为左值或qualified_id

简单来说,

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


0
投票

this
使用地址来引用 current 对象。

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

  • this
    不是左值

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

    this
    是一个 rvalue右值不能出现在左侧(加法、减法等)。

    参考:C++ 右值引用解释

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

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

    基本上,

    &this
    被翻译成
    &&object
    &(&object)
    之类的东西。

基本上,将

this
视为
&object
(但只需记住,因为事实并非如此)。


0
投票

this
是纯右值。

换句话说,它是在需要时动态计算的,否则不存储在内存中。因此它没有持久的地址/位置供您使用。

© www.soinside.com 2019 - 2024. All rights reserved.