83

オブジェクトのアドレスを取得するaddressof(x)代わりに必要かどうかを判断するにはどうすればよいですか?&x


質問が混乱しているように見えるので、明確にする必要があります。

addressofオーバーロードされた address-of 演算子を明らかにバイパスします。私はすでにそれを認識しています。

私が知りたい
のは、それが本当にやりたいことかどうかをどうやって知るかということです。(特にテンプレート内など)

addressofの代わりにいつ必要なのかを理解するのに役立つある種の「ルール」はあり&ますか?
結局のところ、どちらもオブジェクトの「アドレス」を返すので、いつどちらを使用するのでしょうか?

4

5 に答える 5

120

std::addressof必要なときに使用します。悲しいことに、「必要な場合」には、テンプレート コードで作業していて、未知の型の変数を変換しTたりT&、その変数のメモリへの正直なポインターに変換したい場合が含まれます。

C++ 委員会は愚かにも参照演算子のオーバーロードを (ほとんど正当な目的で) 許可したため、参照演算子を使用して実際のポインターを取得できない型を使用して、ユーザーがテンプレートをインスタンス化する可能性があります。std::addressofこの疑わしい C++ 機能を使用して、言語が最初から動作することが保証されているはずのことを行うユーザーを回避する方法です。

要するに、言語の愚かさに対するライブラリの修正です。&ユーザーがコードを壊せないようにする場合ではなく、テンプレート コードで使用します。ユーザーがこの不適切な機能を使用しないと信頼できる場合は、 を使用できます&

于 2013-02-11T20:46:42.220 に答える
16

unary がオーバーロードされたユーザー定義型でoperator&、そのアドレスが必要な場合は、 を使用しますaddressof

&あなたが言うように、そうしないとオーバーロードの目的が無効になるため、常に使用する必要があると思います。もちろん、オーバーロードで何か意味のあることをしない限りaddressof、その場合は必要になりますが(クラスの外では、内部で を使用できますthis)、自分が何をしているのかを非常に確信している必要があります。

operator&詳細は次のとおりです-クラス外でオーバーロードしたい場合(可能です)、アドレスを返すため使用する必要があります。そうしないと、無限再帰が発生します。addressof

struct Class
{
   virtual ~Class() {}
   int x;
};

void* operator&(const Class& x)
{
    //return &x; <---- infinite recursion
    return addressof(x) + 4; //I know this isn't safe
                             //but I also know the intrinsics of my compiler
                             //and platform to know this will actually return
                             //the address to the first data member
}

私はこれが安全ではないことを知っています。

于 2013-02-11T20:31:14.910 に答える
9

address-ofoperator&オーバーロードの結果ではなく、オブジェクトの実際のアドレスを知りたい場合に使用します。

于 2013-02-11T20:31:02.807 に答える
7

私の意見のみ:

あなたがクラスとそのインターフェースを設計するチームの一員でない限り、絶対にしないでください。私は個人的に、その演算子をオーバーロードする正当な理由を見たことがありません。しかし、誰かが意味のあるクラスを設計し、そのクラスが公共の消費を目的としていると仮定した場合 (つまり、クラスは特定のライブラリでのみ内部使用するためのものではありません)、そのクラスは通常のコードで動作することを期待します。当然のことながら、それ&は「のアドレス」を意味します。演算子をオーバーロードするクラスがそのような賢明な方法で設計されていない場合、私はそのクラスを使用しません。そのクラスが壊れているか、その一部であるライブラリの外で使用することを意図していないためです。

于 2013-02-11T20:38:40.753 に答える
6

結局のところ、どちらもオブジェクトの「アドレス」を返すので、いつどちらを使用するのでしょうか?

オーバーロードされたものがオブジェクトの「アドレス」であるという保証はまったくありませんoperator&。そうでない可能性があります。または、クラスの作成者がおそらくそれをオーバーロードすることを気にしなかったでしょう。彼らはそれをオーバーロードして別の型を返したり、void不適切な方法で人々がそのアドレスを取得するのを防ごうとした場合に返すことさえできた可能性があります。

オーバーロードされた可能性のあるオブジェクトへのポインターが必要な場合&(たとえば、その型がテンプレート パラメーターであるためわからないため) std::addressof、オブジェクトの実際のアドレスを返さない型をテンプレートがサポートしていないことを使用または文書化します。右のタイプとして。

于 2013-02-11T21:34:58.710 に答える