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
.
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]
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.
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"
Oui, on renvoie un bool
, tandis que l'autre, un boo
...
après l'édition:
non, ce sont les mêmes.
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.
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").
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.
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.
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.
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.
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:)
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.