Tout d'abord, pour retourner une référence que vous n'avez pas besoin d'utiliser l'opérateur esperluette sur l'objet référencé ; il est nécessaire si vous voulez obtenir un pointeur. Donc, je suppose que vous vouliez écrire return Bar;
.
Ensuite, non, vous ne pouvez pas faire cela; dans une méthode const
vous avez un pointeur const
this
(dans votre cas, il serait un const Foo *
), ce qui signifie que toute référence vous pouvez accéder à ses champs sera une référence const
, puisque vous y accéder par un " const
chemin ". Donc, si vous essayez de faire ce que vous avez fait dans ce code, vous obtiendrez une erreur de compilation, puisque vous essayez d'initialiser un int &
(la valeur de retour de votre méthode) avec un const int &
(la référence obtenir de Bar
), ce qui est évidemment interdit.
g ++ dit en fait:
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*’
qui est ce que je viens de dire. Si vous renvoyez une référence const
à un champ de classe à partir d'une méthode const
, vous n'aurez aucun problème.
- Hors champs marqués comme
mutable
, qui indique au compilateur que ces champs sont modifiables même de const
méthodes; cette exception a été introduite pour permettre aux méthodes const
de changer l'état "réel" de l'objet dans les cas où cela ne modifie pas son état "logique"; cela peut être utile pour mettre en œuvre l'évaluation paresseuse, comptage de référence, ...
Je pense que vous avez déjà répondu à votre question. De plus, dans l'exemple Bar est déjà public. – XAder
'& Bar' a le type' const int * ', pas' int & '. Votre compilateur devrait vous dire que ce n'est pas OK. –
Avez-vous essayé de compiler? Qu'est-ce que le compilateur vous a dit? –