0

ポインターを逆参照して代入すると、ポインターが指しているものが変更され、ポインターが指しているものが呼び出されませんoperator=。私はそれを証明するためにこのプログラムを作りました:

#include <iostream>

struct S
{
    void operator =(int)
    { x = 5; }

    operator int*()
    {
        return &x;
    }

    int x;
};

std::ostream& operator <<(std::ostream& out, S const& s)
{
    return out << s.x;
}

int main()
{
    S s;
    int *x = s;
    *x = 10;

    std::cout << *x;
}

これにより、10 が出力されます。実行しても、オブジェクトのポイント*x = 10は変更されません。xどうすればそうすることができますか?(C++11 ソリューションは大歓迎です)

4

4 に答える 4

2

あなたのコードは未定義の動作です。完全な式の最後で破棄される一時的なアドレスにint *x = S();初期化されるため、不正です。x*x

于 2013-06-04T00:12:22.997 に答える
1

使用std::reference_wrapper:

#include <memory>
#include <functional>

int main()
{
    S s;
    auto x = std::make_shared<S>(std::ref(s));
    *x = 10;

    std::cout << *x; // prints 5
}

これがデモです。

于 2013-06-04T00:44:18.713 に答える
1

メイン関数のローカルx変数の型はpointer to intです。それintが指している は、によって返されるインスタンスのS::x サブオブジェクトです。逆参照すると、まだサブオブジェクトである型の左辺値が得られます。したがって、この lvalueを呼び出すと、 user-defined ではなくbuiltin にディスパッチされます。SS::operator int*intS::xoperator=intint::operator=S::operator=

ユーザー定義S::operator=関数は、クラスのメンバー サブオブジェクトによって「継承」されません。これがあなたを混乱させていると思います。

を使用する場合はS::operator=、 type の左辺値で呼び出す必要がありますS

int main()
{
    S s;
    S *x = &s;
    *x = 10;

    std::cout << x->x;
}

あなたが望むことをして、 を呼び出しますS::operator=

于 2013-06-04T01:07:00.063 に答える
0

おそらく、型 S の x を定義するつもりでしたか? int 型の場合、オーバーロードされた演算子を呼び出す理由はありません。

于 2013-06-04T00:16:04.827 に答える