Я реализую комплексный класс в качестве упражнения, и я смотрю на это файл в качестве руководства.
В какой-то момент в этом файле я обнаружил странный перегруженный оператор:
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; }
Определение, которое вы показываете для неконстантного real
вернуть ссылку _Tp&
который может быть использован в качестве l-value
просто хорошо. Я предполагаю, что ваша версия не возвращает ссылку и, следовательно, не будет работать.
Эта статья Понимание lvalues и rvalues в C и C ++ отличная ссылка на эту тему.
это real()
возвращает ссылку на _M_real;
член. Ссылка может быть использована в качестве lvalue.
Чтобы вы могли сделать то же самое, вам также необходимо вернуть ссылку.
Обратите внимание, что реализации возвращают _Tp&
; это ссылка в _Tp
, Это делает возвращаемое значение l-значением.