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.
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; }
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; }
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.