是否可以获得'this'指针的地址?

Is it possible to obtain the address of the 'this' pointer?

我读到 this 是一个右值,我们无法通过应用 &this 来获取它的地址。

在我的代码中,我尝试使用对 this 的引用绑定。我想知道哪种方式会给出this的地址?或者两者都错了?

this到底是什么?左值、右值、关键字或其他?

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

"you cannot take the address of this"的意思是,你不能写&this

您要的是this指针表示的地址,对吗?这就是您的第一个输出的作用。

this 本身并没有具体化为指针,例如MyString* x 会。在这里,x 本身在内存中有一个位置,你可以做某事。喜欢 &x。这对于 this.

是不可能的

您最后一个问题的答案是:是的,this 是关键字。表达式 this 是一个基本表达式。您可以在 C++ 标准的 [expr.prim.this] 节中阅读它。

I'm wondering which may give the address of this? Or both are wrong?

this的地址也不是,因为C++抽象机没有为它定义地址。 this 就像 0。你不能得到 0 的地址,它不是一个有存储的实体,只是一些值。那么这有什么作用呢?

int const& i = 0;

它创建一个临时对象,用 0 初始化它,然后将引用绑定到它。您的代码中发生了同样的事情。您创建对不同临时对象的引用,这些临时对象包含 this.

value

this是一个关键字,代表成员函数正在执行的对象的地址。 C++ 抽象机不需要它占用存储空间,所以它总是(逻辑上)只是一个普通值,比如 0.

不需要 this 占用存储空间是有好处的。它允许通过 ABI 实现 C++,其中 this 在寄存器中传递(通常无法寻址的东西)。如果 &this 必须是 well-defined,即如果 this 必须是可寻址的,它将阻止实现使用寄存器来传递地址。 C++ 标准通常旨在不将实现捆绑在一起。

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

以上程序产生以下输出:

Address of obj :: 0x7fffef913627

Address of this :: 0x7fffef913627

Addrss of ptr :: 0x7fffef913627

希望对您有所帮助!

this 关键字的行为本质上与 &__self 相同,其中 __self 是一个左值,指定成员函数所在的对象 运行(*this object) 除了不使用重载的 operator&()

所以 &this 意味着 &&__self 这显然没有意义,你不能获取地址的地址,就像你不能获取标量的地址一样 return 函数值:

int fi(); 
int *fpi(); 

&(fi())&(fpi()) 都是非法的,因为右值 returned 是标量(可能存储在寄存器中)而 作为纯标量值没有地址.