Les parenthèses autour du résultat sont-elles significatives dans une déclaration de retour?

Est-il une différence entre ces deux états à l'intérieur d'une fonction?

bool returnValue = true;

//Code that does something

return(returnValue);

et ça?

bool returnValue = true;

//Code

return returnValue;

le premier a des parenthèses autour de returnValue .

52
demandé sur Rob Kennedy 2011-01-21 21:56:03

12 réponses

C++14 ajoute un cas marginal où les parenthèses autour d'une valeur de retour peuvent modifier la sémantique. Cet extrait de code montre que deux fonctions sont déclarées. La seule différence est entre parenthèses autour de la valeur de retour.

int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))

Dans la première func1 renvoie un int et dans la seconde, func1 renvoie un int& . la différence sémantique est directement liée aux parenthèses .

le spécificateur auto dans sa forme la plus récente a été introduit en C++11. Dans le Langage C++ Spec il est décrit comme:

Spécifie que le type de la variable est déclarée sera automatiquement déduite de son initialiseur. Pour les fonctions, spécifie que le type de retour est une suite type de retour Ou sera déduit de ses déclarations de retour (depuis C++14)

ainsi que C++11 introduit le spécificateur decltype qui est décrit dans le C++ Language Spec :

inspecte le type déclaré d'une entité ou interroge le type de retour d'une expression.

[snip]

  1. si l'argument est soit le nom sans équivalent d'un objet/fonction, soit une expression d'accès membre (object.membre ou pointer - > member), puis le décltype spécifie le type déclaré de l'entité spécifiée par cette expression.

  2. si l'argument est une autre expression de type T, alors

    a) si la catégorie de valeur de l'expression est xvalue, alors le décltype spécifie T & &

    b) si la catégorie de valeur d'expression est lvalue, alors le décltype spécifie T &

    c) dans le cas contraire, decltype spécifie T

[snip]

notez que si le nom d'un objet est mis entre parenthèses, il devient une expression de valeur, donc decltype(arg) et decltype((arg)) sont souvent de types différents.

en C++14, la possibilité d'utiliser decltype(auto) était permise pour les types de retour de fonction. Les exemples originaux sont où la différence sémantique avec les parenthèses entre en jeu. Revisiter les exemples originaux:

int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))

decltype(auto) permet de déduire le type de retour arrière dans la fonction de l'entité/expression sur la déclaration de retour. Dans la première version return var1; est effectivement le même que le retour du type decltype(var1) (un type de retour int par la règle 1 ci-dessus) et dans le deuxième cas return (var1); est effectivement le même que decltype((var1)) (un type de retour int & par la règle 2b).

les parenthèses font le type de retour int& au lieu de int , donc un changement de sémantique. Morale de l'histoire - "Pas toutes les parenthèses sur un type de retour sont créés égaux"

80
répondu Michael Petch 2018-02-18 21:54:31

Oui, on renvoie un bool , tandis que l'autre, un boo ...


après l'édition:

non, ce sont les mêmes.

11
répondu peoro 2011-01-21 18:57:34

Il n'y a pas de différence.

une raison d'utiliser la parenthèse serait si vous vouliez évaluer une expression avant de revenir, mais dans votre exemple, il n'y aurait pas de raison. Voir:

entre Parenthèses entourant les valeurs de retour

pour de plus amples discussions.

5
répondu Karl Rosaen 2017-05-23 11:54:41

AFAIK, rien n'est différent.

en C++, Les expressions peuvent avoir la forme: expr ou (expr) . Donc, ce dernier est une expression avec plus de Dactylographie. Pour en savoir plus, référez-vous à une grammaire (cherchez "expression").

3
répondu Weiser 2011-01-21 18:58:56

les parenthèses de l'exemple supérieur sont superflues; elles sont effectivement ignorées.

ce serait la même chose...

int x = (5);

les parenthèses ici sont ignorées aussi.

3
répondu James 2011-01-21 19:00:27

Non, il n'y a pas de différence dans votre code.

2
répondu Elalfer 2011-01-21 18:58:20

je suppose que boo est une faute de frappe, et vous demandez s'il y a une différence entre

return expr;

et

return(expr);

La réponse est non.

2
répondu aschepler 2011-01-21 18:58:48

Non il n'y a pas de différence entre les deux, mais vous pouvez inclure la parenthèse si elle rend l'expression facile à lire et claire.

1
répondu sanchit.h 2011-01-21 19:19:09

vous ralentissez abusivement le compilateur!

la présence de la parenthèse non seulement ralentit la phase de prétraitement, mais elle génère aussi un arbre de syntaxe abstraite plus compliqué: plus de mémoire, plus de calcul.


d'un point de vue sémantique ? Ils sont exactement identiques. Qu'il y ait une parenthèse ou non, l'instruction return évaluera pleinement l'expression avant de la retourner.

1
répondu Matthieu M. 2011-01-21 19:52:30

ils sont identiques. Je vois souvent la syntaxe entre parenthèses, et je demande toujours à ceux qui l'utilisent: pourquoi ? Et personne ne peut répondre pourquoi ils l'utilisent.

pour résumer sans détour, les parenthèses autour des expressions retournées sont utilisées par les gens qui ne comprennent pas tout à fait la différence entre les macros de type fonctionnel et les fonctions, ou qui sont confus au sujet de la priorité de l'opérateur ou de l'ordre des règles d'évaluation en C. Il n'y a aucun avantage de style de codage d'utiliser parenthèse.

ainsi

return value;

est plus correct que

return (value)

parce que ce dernier suggère que vous ne savez pas tout à fait ce que vous faites:)

1
répondu Lundin 2017-05-17 12:42:34

pas de différence!!

les gens utilisent la parenthèse s'il y a une expression complexe impliquée.

BTW return est une déclaration qui n'est pas une fonction.

0
répondu Prasoon Saurav 2011-01-21 18:57:40

les deux sont les mêmes dans votre cas.

-4
répondu Zeshan Khan 2016-08-01 03:47:44