Функция-член, используемая как lvalue

Я реализую комплексный класс в качестве упражнения, и я смотрю на это файл в качестве руководства.
В какой-то момент в этом файле я обнаружил странный перегруженный оператор:

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; }

1

Решение

Определение, которое вы показываете для неконстантного real вернуть ссылку _Tp& который может быть использован в качестве l-value просто хорошо. Я предполагаю, что ваша версия не возвращает ссылку и, следовательно, не будет работать.

Эта статья Понимание lvalues ​​и rvalues ​​в C и C ++ отличная ссылка на эту тему.

1

Другие решения

это real() возвращает ссылку на _M_real; член. Ссылка может быть использована в качестве lvalue.

Чтобы вы могли сделать то же самое, вам также необходимо вернуть ссылку.

3

Обратите внимание, что реализации возвращают _Tp&; это ссылка в _Tp, Это делает возвращаемое значение l-значением.

1
По вопросам рекламы [email protected]