2011-06-27 6 views

答えて

50

が、私はそれが含まれているポインタのアドレスを返すのではなくしたかったので、operator&をオーバーライドスマートポインタクラスのようなものを覚えているようだ(......私が今までやったことを言うことはできません)スマートポインタオブジェクトのアドレス。私がそれを見た場所や、当時はそれが良いアイデアのように思えるかどうかを覚えていない。

覚えている:MicrosoftのCComPtr

編集:一般化すること、それは次の条件で意味をなすかもしれません:

  • あなたはいくつかの他のオブジェクトになりすましているオブジェクトを持っています。
  • このオブジェクトは、それが偽装しているものへのポインタを取得できます。

正当なポインタ以外を返すと、principle of least astonishmentに違反します。単項&のオーバーロード

+1

@Billyは、私がこれを使用して、私はちょうど長所/短所を覚えていないので、非常に長い時間がかかりました。 COMプログラミングでは、インターフェイスポインタのアドレスを渡すのが一般的な操作なので、防御できます。 –

+0

"含まれているポインタの_アドレス_"は、含まれているポインタを意味しますか? – curiousguy

+5

@curiousguy私はそうは思わない。含まれているポインタは 'T *'型です。 'operator&'によって返されたポインタは 'T **'型であり、含まれているポインタを指しています。 – hvd

9

は(その点で)参照のようなあなたのオブジェクト振る舞いになります。

特に、参照がC++のオブジェクトではなく、独自のアドレスを持たないため、組み込み参照の代替手段を提供しようとするのは間違いないでしょう。ユーザー定義型のインスタンスは必然的にオブジェクトであり、そのアドレスを取得する通常の方法を無効にしたとしても、アドレスを持ちます。だからそれは決して完璧な模倣ではありません。

しかし、人々はポインタに対するユーザー定義の選択肢に非常に熱心であるため、誰かがどのようにそれを試してみるか分かります。私は、ユーザーが気にしないことを望むような(誤った)振る舞いをするようなタイプの作成を避けることはできません。

+0

しかし、https://isocpp.org/wiki/faq/references#overview-refsには次のように書かれています。「リファレンスは基本的なアセンブリ言語のアドレスを使用して実装されることが多いものの、面白い見た目オブジェクトへのポインタであり、参照はオブジェクトであり、オブジェクトへのポインタでもオブジェクトのコピーでもないオブジェクトであることに注意してください」 – Destructor

+1

@PravasiMeet:標準で明示的に言うので、残念です。参照はオブジェクトではないということです。それは変数の名前のようです:変数はオブジェクトですが、その名前はそうではありません。参照の参照はオブジェクトですが、参照自体はオブジェクトではありません。 –

+0

あなたは、リファレンスがオブジェクトではないことを明示的に述べている標準の引用を教えてください。 – Destructor

-1

私は、オペレータ&(その動作を変更せずに)をプライベートとしてオーバーライドしていましたが、スタック内に作成されたオブジェクトへのスマートポインタを時々作成するのを防ぎました。それは本当に良いアイデアだったかどうかまだ分かりません...

+2

あなたの目標を達成できなかったので、それは悪い考えです。参照してください:http://stackoverflow.com/questions/6494591/how-can-i-reliably-get-the-address-of-an-object –

-3

アドレス演算子をプライベートにするためにオーバーロードすることができます。これは、バトンのアドレスを取ることができない、ある種のバトンパススキームを実装するのに便利です。バトンのコンストラクタが隠れていると、バトンのスコープを気密に保つことができます。

+6

'std :: addressof'が存在することを除いて、アドレスは依然として撮影。 http://stackoverflow.com/questions/6494591/how-can-i-reliably-get-the-address-of-an-object –

7

これは、LLVMコードを生成するDSLのコンテキストで有効です。例を示します。 xおよびyは値(すなわち、タイプvalueのオブジェクト)であると言う。次に、式x+yは、あるコードストリームにADD命令を発行します。非常に賢明には、式&xは、アドレスxを取る命令を出す。

10

例えば、ラムダプレースホルダ表記で&操作を表すときに有用です&_1[_2]

8

四年後、別の答え。あなたはC++言語のオフに便乗が、あなた自身のセマンティクスを定義しているとき

私が見てきたもう一つの使用です。プライムの例:Boost.Spirit。

Boost.Spiritは、解析のために特に気に、任意のパーサー・オブジェクトを指定するためのEBNFのような構文を提供するために、パーサに演算子をオーバーロードします。特に、単精度&演算子は、And-Predicate Parserを提供するためにオーバーロードされます。

と述語パーサー(& A)

説明

構文述語は、別の産生を評価する前に満たすべき特定の条件付きの構文をアサートします。セマンティック述語と同様に、epsでは、構文述語は入力を消費しません。 と述語、&、その述語が一致する場合にのみ ゼロ長一致を返し、正の構文述語です。

使用例:

基本先読み例:最後の文字が セミコロンであることを確認して、それを消費しない、ちょうど次の文字で覗い:

test_phrase_parser("Hello ;", lit("Hello") >> &lit(';'), false); 

つまり、簡潔に言えば、&は、ポインタとはまったく関係がありません。 Qiパーサーオブジェクトに適用されるドメイン固有のセマンティクスを持っています。

+1

要するに、式テンプレートの別の例では同じ答えです – sehe

関連する問題