我注意到网络和书籍中参考类型函数的示例代码都只有一个返回行(如下所示,来自MSDN)
class Point
{
public:
unsigned& x();
private:
unsigned obj_x;
};
unsigned& Point :: x()
{
return obj_x;
}
int main()
{
Point ThePoint;
ThePoint.x() = 7;
}
我认为如果我在引用类型函数中包含更多行(算术表达式,控制结构等),它们只会在用作普通(R值)函数时改变其行为。但是我怎么能写一个函数,当它用作L值时,会对它的R值(这里是数字7)进行一些算术运算,或者在将它放入return变量之前对它进行检查(这里是{{ 1}})?
答案 0 :(得分:2)
你的意思是非常 conterintuitive。但这不可能达到这个目的。
您想要的是在代理对象的帮助下完成的常规操作,就像在std::vector<bool>
专业化中完成一样。当您像v[i] = true;
一样使用它时,v[i]
会返回代理对象,它会重载赋值运算符,它会在内部位串中上升ith
位。
示例:
struct A
{
struct proxy
{
proxy(int * x)
: x_(x)
{
}
proxy & operator = (int v)
{
*x_ = v + 2;
return *this;
}
operator int() const
{
return *x_;
}
private:
int * x_;
};
proxy x_add_2()
{
return proxy(&x_);
}
int x() const
{
return x_;
}
private:
int x_;
};
int main(int argc, char* argv[])
{
A a;
a.x_add_2() = 2;
std::cout << a.x() << std::endl;
return 0;
}