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

xmain 函数中的局部变量是pointer to int. int它指向的是实例的子对象S::x 由. 当你取消引用它时,你会得到一个类型的左值,它仍然是子对象。因此,当您调用此 lvalue时,它​​会分派给 builtin ,而不是您的 user-defined 。SS::operator int*intS::xoperator=intint::operator=S::operator=

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

如果要使用,S::operator=则需要使用类型的左值调用它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 回答