Прежде всего, чтобы вернуть ссылку вам не нужно использовать оператор амперсанд на который ссылается объект ; это необходимо, если вы хотите получить указатель . Итак, я полагаю, вы хотели написать return Bar;
.
Тогда нет, вы не можете этого сделать; в методе const
у вас есть const
this
указателя (в вашем случае это будет const Foo *
), что означает, что любые ссылки вы можете получить его полей будет const
ссылка, так как вы к ним доступ через " const
путь ".
Таким образом, если вы пытаетесь сделать то, что вы сделали в этом коде, вы получите ошибку компиляции, так как вы пытаетесь инициализировать int &
(возвращаемое значение вашего метода) с const int &
(ссылками вы получить от Bar
), что, очевидно, запрещено.
г ++ на самом деле говорит:
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
методам изменять «реальное» состояние объекта в случаях, когда это не изменяет его «логическое» состояние; это может быть полезно для реализации ленивых вычислений, подсчета ссылок, ...
Думаю, вы уже ответили на свой вопрос. Кроме того, в примере Bar уже открыт. – XAder
'& Bar' имеет тип' const int * ', а не' int & '. Вы, компилятор, должны сказать вам, что это не нормально. –
Вы пытались скомпилировать? Что рассказал вам компилятор? –