Il y a petite valeur en ajoutant const
aux valeurs r non référencées/non pointées, et aucun point en l'ajoutant aux encastrements.
Dans le cas de types définis par l'utilisateur , a const
La qualification empêchera les appelants de invoquer un non const
fonction membre sur l'objet retourné. Par exemple, étant donné
const std::string foo();
std::string bar();
puis
foo().resize(42);
serait interdit, tandis que
bar().resize(4711);
serait autorisé.
Pour les encastrements comme int
cela n'a aucun sens, car ces valeurs r ne peuvent pas être modifiées de toute façon.
(Je me souviens C++ efficace en discutant de la possibilité de rendre le type de retour de operator=()
a const
de référence, cependant, et c'est un élément à prendre en compte).
Editar:
Il semble que Scott a en effet donné ce conseil . Si c'est le cas, c'est pour les raisons évoquées ci-dessus, Je trouve cela discutable, même pour C++98 et C++03. . Pour C++11, je considère que c'est tout simplement faux comme Scott lui-même semble l'avoir découvert. Dans le errata pour Effective C++, 3e édition. Il écrit (ou cite d'autres personnes qui se sont plaintes) :
Le texte implique que tous les retours par valeur devraient être const, mais les cas où les retours par valeur non const sont de bonne conception ne sont pas difficiles à trouver, par exemple, les types de retour de std::vector où les appelants utiliseront swap avec un vecteur vide pour "récupérer" le contenu de la valeur de retour sans le copier.
Et plus tard :
Déclarer const les valeurs de retour des fonctions by-value empêchera qu'elles soient liées à des références rvalue dans C++0x. Les références rvalue étant conçues pour améliorer l'efficacité du code C++, il est important de tenir compte de l'interaction entre les valeurs de retour const et l'initialisation des références rvalue lors de la spécification des signatures de fonctions.
5 votes
Bonne question - mais dans ce cas, la méthode ne renverrait-elle pas une référence dans les deux cas ?
0 votes
Bonne question. Je vous suggère de le changer en
int operator[](int i)
contreconst int operator[](const int i)
.1 votes
@KenWayneVanderLinde, non. La méthode appelée dépend de si nous avons un
Bigint&
oa const Bigint&
.1 votes
@AlexanderChertov non : il pose une question sur le type de retour, pas sur le type d'argument, donc la question doit se concentrer uniquement sur cela.
0 votes
Pourquoi ? Je me demande personnellement pourquoi quelqu'un aurait
const int i
argumnent.0 votes
Eh bien, dans la lecture, que j'ai trouvée, il y a
const int&
pasconst int
0 votes
@KenWayneVanderLinde : S'il y a une valeur persistante à laquelle renvoyer une référence, alors oui ; mais ce n'est pas toujours le cas, et parfois vous avez besoin de renvoyer une valeur.