Dois-je retourner bool ou const bool?

ce qui est mieux:

bool MyClass::someQuery() const;

const bool MyClass::someQuery() const;

j'ai utilisé 'const bool' depuis que je suis sûr que je me souviens avoir entendu c'est" ce que font les ints " (pour les opérateurs de comparaison par exemple) mais je ne peux pas trouver de preuve de cela n'importe où, principalement en raison d'être difficile à Google et Intellisense n'aidant pas tout ;) quelqu'un peut-il confirmer cela?

pour moi, retourner les valeurs de const (ce n'est pas juste une question de bools) a plus de sens; cela empêchera les temporairesd'être modifiés, ce qui est presque toujours va être un programmeur erreur. Je veux juste quelque chose pour le dos que pour que je puisse vanter de retour const valeurs à mes collègues :)

20
demandé sur Jonathan Leffler 2009-09-18 14:17:38

11 réponses

donc vous savez que c'est juste, vous êtes juste après la voix de L'Autorité? Prévenir la modification accidentelle des temporairesest très utile. En général , vous devez déclarer autant de choses que vous pouvez const , il vous protège contre une variété d'accidents et donne l'optimiseur des conseils utiles.

vous avez une copie de "Effective C++" de Scott Meyers? Point 3 (page 18 de la troisième édition) ;)

il donne le exemple de

class Rational {...};
const Rational operator* (const Rational& lhs, const Rational& rhs );

if( (a * b) = c ) // declaring operator *'s return value const causes error to be caught by compiler
26
répondu moonshadow 2009-09-18 10:24:06

C'est le cas lorsque const n'ajoute aucune valeur mais gonfle le code et fait réfléchir le lecteur. Quel est l'intérêt de ce const ? L'appelant peut copier la valeur dans une variable non-const et faire ce qu'il veut avec elle de toute façon.

32
répondu sharptooth 2009-09-18 10:33:04

notez que if((a*b) = c) ne sera pas compilé pour les types intégrés de toute façon, il est donc très pertinent de savoir s'il s'agit de types intégrés (votre question demande bool ) ou de types définis par l'utilisateur.

pour les types encastrés il n'a aucun sens, donc il ne devrait pas être utilisé. Et pour les types définis par l'utilisateur, je suis dans le camp de jalf: et si l'appelant veut pour modifier l'objet retourné?

Je ne suis pas convaincu que if((a*b) = c) est un si bon argument pour retourner const types définis par l'utilisateur, puisque je ne me souviens pas de la dernière fois où j'ai vu un compilateur pas mettre en garde à ce sujet.

19
répondu sbi 2017-05-23 12:10:21

pour être un peu plus précis, seuls les" objets " peuvent être considérés. La définition d ' "objet" de la norme C++ inclut tout ce à quoi une valeur se réfère ("a un nom") et les temporairesde type de classe. Une valeur de retour booléenne est une valeur R d'un type non-class, c'est pourquoi un compilateur conforme aux normes ignorera simplement "const" dans ce cas. Comme d'autres déjà dit, c'est inutile dans ce contexte.

16
répondu sellibitze 2009-09-19 14:32:29

lorsque vous retournez une référence à une variable membre, il est logique de la faire coïncider. Ici vous retournez une copie, donc il n'y a pas besoin de const.

14
répondu Naveen 2009-09-18 10:22:13

le modificateur const n'est utilisé que pour les types retournés par référence (soit comme référence const SomeObject& ou via un pointeur const SomeObject* ), de sorte que l'appelant ne pourra pas modifier l'objet via le pointeur/référence. Les types primitifs sont retournés par la valeur , ce qui signifie que l'appelant reçoit une copie de l'objet, pas l'objet lui-même.

donc, const n'est pas vraiment approprié pour les types de valeurs retournés. Puisque la copie est hors du contrôle de la fonction appelée, la fonction appelée ne devrait pas dicter à l'appelant qu'elle ne peut pas être changée.

7
répondu Tony the Pony 2009-09-18 10:35:21

ça n'a aucune importance. Par conséquent, le consensus est de revenir juste bool .

la raison pour laquelle cela n'a pas d'importance est que vous ne pouvez pas appeler les fonctions de membre non-const de toute façon; bool n'est pas une classe ou une structure.

2
répondu MSalters 2009-09-18 10:23:49

Comme bool va être copié, c'est la même chose, à mettre const ou non. En Plus, vous aurez peut avoir certains compil des problèmes.

2
répondu user175491 2009-09-18 11:59:57

const type de retour

résumé:

La valeur d'un type de retour n'est le const déclaré ne peut pas être modifié. Ce est particulièrement utile lorsque vous donnez un référence à une classe de fonctionnement interne, mais peut aussi prévenir les erreurs plus rares.

1
répondu adatapost 2009-09-18 10:27:24
const bool func();
bool f = func();

0 erreurs, 0 Avertissements. Qu'avez-vous accompli à part une inflation inutile des codes?

0
répondu Chris Becke 2009-09-18 11:58:48

C'est un ancien post, mais je pense qu'il est intéressant de mentionner qu'il y a un cas de coin potentiel ici depuis C++11. Alors que, comme indiqué par d'autres, il ne fera aucune différence si vous utilisez const bool ou bool comme type de retour dans la plupart des cas, si vous utilisez C++11 decltype et associés, par exemple result_of , vous pouvez déclarer une variable avec le même type que la valeur de retour d'une certaine fonction, et donc le const aurait en fait un effet dans ce cas.

0
répondu jdehesa 2017-11-27 10:56:55