this
ポインターの値は、特定のオブジェクトの存続期間中、一定であることが保証されていますか?それが変わるようなケースは想像できませんが、何かを逃していないかどうかはわかりません。
std::move
を変更しthis
ます。正式には、これらは2つの異なるオブジェクトであると言いますが、非公式に「同じ」と考えるかもしれません。
this
ポインターの値は、特定のオブジェクトの存続期間中、一定であることが保証されていますか?それが変わるようなケースは想像できませんが、何かを逃していないかどうかはわかりません。
std::move
を変更しthis
ます。正式には、これらは2つの異なるオブジェクトであると言いますが、非公式に「同じ」と考えるかもしれません。
回答:
this
ポインターの値は、特定のオブジェクトの存続期間中、一定であることが保証されていますか?
はい。
ユーザーAconcaguaが言うように:this
ポインターの値は常に、関数が1で呼び出されたオブジェクトのアドレスの値です。したがって、質問は次と同等です:
オブジェクトは、メモリアドレスを存続期間中に変更できますか?
lifetime
2の定義により、これは不可能です。オブジェクトの存続期間は、そのストレージが取得されたときまたは取得された後に始まり、解放される前に終了します。
非静的(
[class.mfct]
)メンバー関数の本体では、キーワードthis
はprvalueであり、その値は、関数が呼び出されるオブジェクトへのポインターです。
2) [basic.life]/1
(鉱山を強調)
オブジェクトまたは参照の存続期間は、オブジェクトまたは参照の実行時プロパティです。変数は、デフォルトで初期化されていて、クラス型または(多次元の可能性がある)配列である場合、空の初期化があると言われます。そのクラス型には、簡単なデフォルトコンストラクターがあります。 タイプのオブジェクトの存続期間は、次の場合に
T
始まります。
- ストレージ適切な整列およびサイズを有するタイプのが
T
取得され、そして- その初期化(存在する場合)は完了します(空の初期化を含む)(
[dcl.init]
)。ただし、オブジェクトがユニオンメンバーまたはそのサブオブジェクトである場合、そのユニオンメンバーがユニオン内の初期化されたメンバーである場合にのみ、ライフタイムが開始します([dcl.init.aggr]
、[class.base.init]
)、またはに記載されてい[class.union]
ます。
o
タイプのオブジェクトの存続期間は、次の場合にT
終了します。
- 場合
T
非クラスタイプであり、オブジェクトが破壊され、または- 場合は
T
クラス型で、デストラクタの呼び出しが開始され、または- オブジェクトが占めるストレージが解放されるか、
o
([intro.object]
)内にネストされていないオブジェクトによって再利用されます。
this
、ヒープ内の動きに関係なく、常に同じ値を提供するために、「そのまま」動作する必要があるということだけですか?
オブジェクトにはストレージ領域があります。this
そこにポイント。
オブジェクトは、その構築期間(
[class.cdtor]
)、存続期間、および破棄期間()でストレージ領域を占有します[class.cdtor]
。
の値はthis
、プログラムがこれを読み取る場合、その後読み取り値の一部のビットがガベージコレクションできない場合、または読み取り値の一部のビットがプログラムの外にエスケープされる場合は、一定であることが保証されます。それ以外の場合はすべて、シュレーディンガーの猫のように動作します。つまり、一定であり、同時に可変です。
this
this
ポインタの値は常に、関数が呼び出されたオブジェクトのアドレスの値です。したがって、質問は「オブジェクトがそのメモリアドレスを存続期間中に変更できるか」