Прежде всего, чтобы вернуть ссылку, вам не нужно использовать оператор амперсанда на указанном объекте;он необходим, если вы хотите получить на него указатель .Итак, я предполагаю, что вы хотели написать return Bar;
.
Тогда нет, вы не можете этого сделать;в методе const
у вас есть указатель const
this
(в вашем случае это будет const Foo *
), что означает, что любая ссылка, которую вы можете получить на его поля 1 , будетconst
ссылка, так как вы обращаетесь к ним по "const
пути".
Таким образом, если вы попытаетесь сделать то, что вы сделали в этом коде, вы получите ошибку компиляции, так как вы 'я пытаюсь инициализировать int &
(возвращаемое значение вашего метода) с const int &
(ссылка, которую вы получаете из Bar
), что, очевидно, запрещено.
g ++ фактически говорит:
testconstref.cpp: In member function ‘int& Foo::GetBar() const’:
testconstref.cpp:9: error: invalid initialization of non-const reference of type ‘int&’ from a temporary of type ‘const int*’
это то, что я только что сказал.:)
Если вместо этого вы вернете const
ссылку на поле класса из const
метода, у вас не возникнет проблем.
- Исключая поля, помеченные как
mutable
, что говорит компилятору, что такие поля могут быть изменены даже из const
методов;это исключение было введено, чтобы позволить const
методам изменять «реальное» состояние объекта в тех случаях, когда это не меняет его «логическое» состояние;это может быть полезно для реализации отложенной оценки, подсчета ссылок, ...