如何使指针的取消引用保存对象的引用?

时间:2013-06-04 00:11:09

标签: c++

当我取消引用指针并为其指定时,它会更改指针所指向的内容,而不会调用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 个答案:

答案 0 :(得分:2)

您的代码是未定义的行为。 int *x = S();x初始化为临时地址,该地址在完整表达式结束时被销毁,因此*x是非法的。

答案 1 :(得分: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
}

Here is a demo.

答案 2 :(得分:1)

main函数中的本地x变量属于pointer to int类型。它指向的intS::x实例的S 子对象,由S::operator int*返回。当您取消引用它时,您会得到int类型的左值,它仍然是S::x子对象。因此,当您在此左值operator=上致电int时,会调度到内置int::operator=,而非用户定义的S::operator=

用户定义的S::operator=函数不是由类的成员子对象“继承”的。我认为这让你感到困惑。

如果您想使用S::operator=,则需要使用S类型的左值来调用它:

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

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

将按照您的意愿行事并致电S::operator=

答案 3 :(得分:0)

也许您打算定义S类型的x?当它是int类型时,它没有理由调用重载的运算符。