Dans de Stroustrup exemple, quel est le côlon dire dans “return 1 : 2”?
Je ne comprends pas une utilisation particulière d'un colon.
Je l'ai trouvé dans le livre Le Langage de Programmation C++ par Bjarne Stroustrup, 4e édition, l'article 11.4.4 "Appel et de Retour", page 297:
void g(double y)
{
[&]{ f(y); } //return type is void
auto z1 = [=](int x){ return x+y; } //return type is double
auto z2 = [=,y]{ if (y) return 1; else return 2; } //error: body too complicated
//for return type deduction
auto z3 =[y]() { return 1 : 2; } //return type is int
auto z4 = [=,y]()−>int { if (y) return 1; else return 2; } //OK: explicit return type
}
La confusion du côlon apparaît sur la ligne 7, dans la déclaration return 1 : 2
. Je n'ai aucune idée de ce qu'elle pourrait être. Ce n'est pas une étiquette ou d'un opérateur ternaire.
Il semble comme un conditionnel opérateur ternaire sans le premier membre (et sans le ?
), mais dans ce cas je ne comprends pas comment cela pourrait fonctionner sans condition.
- C'est une erreur de compilation sur ma fin (gcc et clang). En Plus de toutes ces lignes ont besoin de points-virgules, mais toujours une erreur.
- Modérateur Remarque: s'il vous Plaît réfléchir très attentivement avant de lancer un vote pour fermer cela comme une "faute de frappe" de la question. Oui, le problème, c'est une faute de frappe, mais ce n'est pas une faute de frappe que le demandeur a fait. C'est plutôt celle qui se trouve dans un livre publié. Que signifie cette question et ses réponses pourraient bien vous être utiles à d'autres dans l'avenir, ce qui est une forte contre-indicateurs pour la refermer comme une faute de frappe. (Mise à JOUR: Cette rubrique est maintenant en cours de discussion sur Meta; sentez-vous svp libre pour peser là.)
- Peut-être la meilleure réponse serait: Essayez de compiler le code; s'il ne compile pas, c'est une bonne indication que c'est une faute de frappe.
- Je ne peux penser à un certain nombre d'exemples sur le dessus de ma tête qui ne parviennent pas à compiler (ou même causer une erreur interne du compilateur) sur un compilateur, mais sont acceptés sans problème sur une autre
- J'ai juste essayé quelques fois des expressions avec MSVC et ils n'ont pas à compiler. Donc clairement, l'ensemble du chapitre, je viens de lire doit être une faute de frappe? 😉 Compilateurs C++ ne parviennent pas à compiler valide le code C++ de tous les temps, vient de la langue étant ridiculement compliqué.
- Trop vrai malheureusement que d'un compilateur ou d'un autre échoue à compiler, "valide" de code, et peut-être que C++ est particulièrement médiocre dans ce domaine. Mais toujours la première chose à faire est d'essayer un compilateur.
- J'ai ajouté mon "compiler" commentaire, parce que les réponses ci-dessous a omis de le mentionner et il n'y a aucune indication de l'OP de toutes les erreurs de compilation.
- utilisation
auto z3 =[y]() { return y ? 1 : 2; }
- Probablement dû à l'éditeur de ne pas l'exécution de leur linter...
Vous devez vous connecter pour publier un commentaire.
C'est une faute de frappe. Regardez Errata pour les 2e et 3e éditions du Langage de Programmation C++ . L'exemple doit être comme ci-dessous:
(y)
et pas seulementy
?(cond) ? a : b
pour plus de clarté -- il m'aide à éviter d'erreur de lecture, par exemple, la déclarationfoo = x > y ? a : b
commefoo = x ...
lors de l'écrémage par le code.auto z3 =[y]() { return (y) ? 1 : 2; };
. Comme pour les parenthèses autour dey
, ils sont inutiles et à mon avis pas particulièrement bon style (mais inoffensif, bien sûr). Plusieurs autres lignes dans cette fonction ont(y)
pour d'autres raisons; peut-être Stroustrup juste copié qui.if (y) return 1; else return 2;
->(y) ? 1 : 2;
Me semble une simple faute de frappe. Devrait probablement être:
Noter que depuis le lambda ne prend pas de paramètres, les parenthèses sont facultatives. Vous pouvez l'utiliser au lieu de cela, si vous avez préféré:
return 1 : 2;
est une erreur de syntaxe, il n'est pas un code valide.Un énoncé correct devrait être plus comme
return (y) ? 1 : 2;
à la place.