3

確かに、単項演算子をオーバーライドしたい理由は思いつきませんが、 https://stackoverflow.com/a/4542813/368896では、ポスターは一部のクラスに関して次のように述べています。&X

...単項をオーバーロードしてこれを返すなど、Xが本当にばかげたことをしない限り

(注: このコメントは、演算子自体をオーバーライドするという事実ではなく、&演算子が を返すという事実を指していると思います。)this&

そのコメントについて考えてみると、「これを返す」ことは、多重継承の場合でも、まさに演算子が行うことだと思いました&

単項演算子をオーバーライドしたくない場合、(オーバーライドすることにした場合) 単項演算&子を返すのはなぜ馬鹿げているのthisでしょうか?

4

2 に答える 2

7

「これを返す」ことはまさに & 演算子が行うことだと思いました

その通りですが、C++ では一時オブジェクトのアドレスを取得することも禁止されています。

あなたが参照する質問のコンテキストでは、オブジェクトが一時的であるかどうかを判断することについてです:

operator &を返す独自のものを実装すると、常に有効thisであることをコンパイラに伝えることで、この保護をバイパスします。&(expression)検討:

struct foo
{
};

struct bar
{
    bar* operator&()
    {
        return this;
    }
};

template <typename T>
void test(const T*)
{
    // no temporaries, can't take address of temporary...right?
}

int main()
{
    foo x;
    test(&x); // okay, x is an lvalue

    /*
    test(&(foo())); // not okay, cannot take address of temporary
    */

    bar y;
    test(&y); // still okay, y is an lvalue

    test(&(bar())); // huh?! not taking address of temporary, calling operator&
}
于 2013-03-17T18:57:34.690 に答える
2

実際、用途は非常に限られています。 たとえば、オブジェクトをラップするために Direct3D でよく使用されるスマートポインターが 1 つのユースケースIUnknownです。

あなたは Direct3D に慣れていないと思いますので、もう少し詳しく説明します。多くの Direct3D クラスは から派生しIUnknown、使用された後に呼び出す必要がありますRelease。はい、D3D は内部的に参照カウントを使用します。人々は電話をかけることを忘れがちReleaseで、本当に退屈です。つまり、舞台裏でリリースを行う に をラップするIUnknownことです。smartpointer

smart_pointer<ID3D11Device> device = // .. 

&deviceしたがって、のアドレスが不要であると述べると、 のアドレスがsmart_pointer<ID3D11Device>必要になりますID3D11Device

template <class T>
class com_ptr
{
private:
    T *inst;

public:
   // many other methods/overloadings

    T** operator & ()
    {
        return &inst;
    }
};

結論:この方法では、デストラクタで呼び出すことができRelease、コードの残りの部分でそれを気にする必要はありません。

結論 2:これを行うためのより良い方法get()は、インターン オブジェクトを返すメソッドを追加することです。

    T** get()
    {
        return &inst;
    }
于 2013-03-17T18:47:18.933 に答える