当我取消引用指针并为其指定时,它会更改指针所指向的内容,而不会调用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解决方案)
答案 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
}
答案 2 :(得分:1)
main函数中的本地x
变量属于pointer to int
类型。它指向的int
是S::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类型时,它没有理由调用重载的运算符。