我正在实施一个Complex类作为练习,我正在看这个file作为指导。
在这个文件的某个时刻,我发现了一个奇怪的重载运算符:
template<typename _Tp>
inline complex<_Tp>
operator+(const complex<_Tp>& __x, const _Tp& __y)
{
complex<_Tp> __r = __x;
__r.real() += __y;
return __r;
}
如何将__r.real()
用作lvalue
?我尝试在我的课程中实现它,以及real()
的两个重载定义,但当然它给了我一些错误。
有人能告诉我我错过了什么吗?
这些是函数real()
和imag()
:
template<typename _Tp>
inline _Tp&
complex<_Tp>::real() { return _M_real; }
template<typename _Tp>
inline const _Tp&
complex<_Tp>::real() const { return _M_real; }
template<typename _Tp>
inline _Tp&
complex<_Tp>::imag() { return _M_imag; }
template<typename _Tp>
inline const _Tp&
complex<_Tp>::imag() const { return _M_imag; }
答案 0 :(得分:3)
其real()
正在返回对_M_real;
成员的引用。引用可以用作左值。
为了让你的能够做到这一点,你还需要返回一个引用。
答案 1 :(得分:1)
请注意,实现返回_Tp&
;也就是说,引用到_Tp
。这使得返回值为l值。
答案 2 :(得分:1)
您为非const real
显示的定义会返回一个引用_Tp&
,可以用作l-value
就好了。我猜你的版本没有返回引用,因此无法工作。
本文Understanding lvalues and rvalues in C and C++是关于此主题的绝佳参考。