Je ne comprends pas une utilisation particulière des deux points.
Je l'ai trouvé dans le livre The C ++ Programming Language de Bjarne Stroustrup, 4e édition, section 11.4.4 "Call and Return", 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
}
Les deux points déroutants apparaissent à la ligne 7, dans la déclaration return 1 : 2
. Je n'ai aucune idée de ce que cela pourrait être. Ce n'est pas une étiquette ou un opérateur ternaire.
Cela ressemble à 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.
Réponses:
C'est une faute de frappe dans le livre. Regardez Errata pour les 2e et 3e impressions du langage de programmation C ++ . L'exemple doit être comme ci-dessous:
la source
(y)
et pas justey
?(cond) ? a : b
pour plus de clarté - cela m'aide à éviter de mal interpréter, par exemple, la déclarationfoo = x > y ? a : b
commefoo = x ...
lors du survol du code.Cela me ressemble à une simple faute de frappe. Devrait probablement être:
Notez que puisque le lambda ne prend aucun paramètre, les parens sont facultatives. Vous pouvez utiliser ceci à la place, si vous préférez:
la source
return 1 : 2;
est une erreur de syntaxe, ce n'est pas du code valide.Une déclaration correcte serait plutôt la même
return (y) ? 1 : 2;
chose.la source