1

我正在实现一个复杂的类作为练习,我正在查看这个文件作为指导。
在这个文件的某个地方,我发现了一个奇怪的重载运算符:

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()as 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; }
4

3 回答 3

3

real()正在返回对_M_real;成员的引用。引用可以用作左值。

为了使您能够做到这一点,您还需要返回一个参考。

于 2013-05-30T16:28:20.540 回答
1

请注意,实现返回 a _Tp&; 也就是对的引用_Tp。这使得返回值成为左值。

于 2013-05-30T16:28:15.760 回答
1

您为非常量显示的定义real返回一个_Tp&可以用作l-value很好的引用。我猜你的版本没有返回参考,因此不起作用。

这篇文章理解 C 和 C++中的左值和右值是关于这个主题的一个很好的参考。

于 2013-05-30T16:30:38.703 回答