用作左值的成员函数

时间:2013-05-30 16:26:12

标签: c++ operator-overloading lvalue member-functions

我正在实施一个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; }

3 个答案:

答案 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++是关于此主题的绝佳参考。