web-dev-qa-db-fra.com

Dans l'exemple de Stroustrup, que signifie le signe deux-points dans "return 1: 2"?

Je ne comprends pas une utilisation particulière des deux points.

Je l'ai trouvé dans le livre Le langage de programmation C++ par Bjarne Stroustrup, 4e édition, section 11.4.4 "Appel et 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
}

Le deux-points déroutant apparaît à la ligne 7, dans la déclaration return 1 : 2. Je n'ai aucune idée de ce que ça pourrait être. Ce n'est pas un opérateur d'étiquette ou ternaire.

Il semble être un opérateur ternaire conditionnel sans le premier membre (et sans le ?), mais dans ce cas, je ne comprends pas comment cela pourrait fonctionner sans condition.

163
Piockñec

C'est une faute de frappe. Regardez Errata pour les 2e et 3e impressions du langage de programmation C++ . L'exemple doit être comme ci-dessous:

auto z3 =[y]() { return (y) ? 1 : 2; }
205
S.M.

Me semble être une simple faute de frappe. Devrait probablement être:

auto z3 =[y]() { return y ? 1 : 2; }

Notez que puisque le lambda ne prend aucun paramètre, les parens sont facultatifs. Vous pouvez l'utiliser à la place, si vous préférez:

auto z3 =[y] { return y ? 1 : 2; }
19
Jerry Coffin

return 1 : 2; Est une erreur de syntaxe, ce n'est pas un code valide.

Une instruction correcte ressemblerait plutôt à return (y) ? 1 : 2; à la place.

11
Remy Lebeau