誰かが&(* similarObject)とsimilarObjectの違いは?彼らは同じではありませんか?
dynamic_cast<SomeObject *>(&(*similarObject));
私にこれを説明していただけます間接参照ポインタのアドレスをすることのポイントは何ですか?ポインタそのものだけがそのアドレスではないでしょうか?
誰かが&(* similarObject)とsimilarObjectの違いは?彼らは同じではありませんか?
dynamic_cast<SomeObject *>(&(*similarObject));
私にこれを説明していただけます間接参照ポインタのアドレスをすることのポイントは何ですか?ポインタそのものだけがそのアドレスではないでしょうか?
similarObject
のタイプがoperator*
にオーバーロードされている可能性があります。したがって、そのアドレスがdynamic_cast
に渡されているものを返します。
&(*x)
およびx
は常に同じものです。たとえば、イテレータを考える:
it
のタイプがあるstd::map<int, int>::iterator
&(*it)
のタイプはstd::pair<int,int>*
です:
std::map<int, int>::iterator it = v.begin();
その後
it
と&(*it)
は、2つの異なるものです彼らはではない。あなたのコードスニペットでも同様のことが起こる可能性があります。
'&v [0]'の代わりに '&* v.begin()'を使用して 'std :: vector'の先頭へのポインタを取得することがあります。 –
@Alexandre:その場合、私は '&v [0]'が分かりやすいので、 '&* v.begin()'よりも好きです。 – Nawaz
私は '&v [0]'を見つけやすくなりましたが、もはやそれはありません。味は時間とともに変化します。 –
similarObjectがスマートポインタの場合、このテクニックは、*がオーバーロードされたときに生ポインタの参照を取得するために使用されることがあります。
'auto_ptr'、Boostとtr1スマートポインタはすべてこのための関数を持っています。' .get() ' –
similarObject
は左辺値ですが、&*similarObject
は右値です。
'&* similarObject'は右辺値である必要はありません。それは左辺値でもあります。 – Nawaz
@ Nawaz:参照を返すために単項 '&'演算子をオーバーロードする場合のみ。あなたが絶対にしてはならないものです。 – fredoverflow
similarObjectはスマートポインタですか? *このメソッドは、*がオーバーロードされたときに生ポインタの参照を取得するために使用されることがあります。 – DanDan
逆参照とアドレス演算子がおそらくオーバーロードされていますか? –
@ダンダン:答えとしてこれを入れてください。 –