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
どちらが
this
のアドレスを与えるのだろうか?または両方が間違っていますか?
C++抽象マシンはアドレスを定義していないので、this
のアドレスも同じではありません。 this
は0
に似ています。アドレス0を取得することはできません。これは、ストレージを持つエンティティではなく、単なる値です。これは何をするのでしょうか?
int const& i = 0;
一時オブジェクトを作成し、0で初期化してから、参照をそれにバインドします。コードでもまったく同じことが起こります。 this
の-valueを保持するさまざまな一時オブジェクトへの参照を作成します。
this
は、メンバー関数が実行されているオブジェクトのアドレスを表すキーワードです。 C++抽象マシンは、ストレージを占有する必要がないため、常に(論理的に)0のような単純な値です。
ストレージを占有するためにthis
を必要としないことにはメリットがあります。 this
がレジスター(通常はアドレス指定できないもの)で渡されるABIを介してC++を実装できます。 &this
を明確に定義する必要がある場合、つまりthis
をアドレス可能にする必要がある場合、アドレスを渡すためにレジスターを使用する実装が妨げられます。 C++標準は一般に、そのような実装を結び付けないことを目的としています。
「this
のアドレスを取得できない」という意味は、&this
を記述できないことです。
this
ポインタでアドレスrepresentedを要求していますよね?これは、最初の出力が行うことです。
this
自体は、たとえばポインタのように具体化されません。 MyString* x
になります。ここでは、x
自体にメモリ内の場所があり、sthを実行できます。 &x
など。これはthis
では不可能です。
あなたの最後の質問への答えは:はい、this
はキーワードです。式this
は一次式です。これについては、C++標準のセクション[expr.prim.this]
で読むことができます。
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
お役に立てば幸いです。
this
キーワードは基本的に&__self
として動作します。ここで、__self
は、メンバー関数が実行されるオブジェクト(*this
オブジェクト)を指定する左辺値です。ただし、オーバーロードされたoperator&()
は使用されません。
したがって、&this
は&&__self
を意味します。これは明らかに意味がありません。関数のスカラー戻り値のアドレスを取得できないのと同じように、アドレスのアドレスを取得できません。
int fi();
int *fpi();
&(fi())
と&(fpi())
はどちらも不正です。返される右辺値はスカラー(おそらくレジスタに格納される)であり、純粋なスカラー値にはアドレスがないためです。