Ich verstehe eine bestimmte Verwendung eines Doppelpunkts nicht.
Ich fand es in dem Buch The C ++ Programming Language von Bjarne Stroustrup, 4. Auflage, Abschnitt 11.4.4 "Call and Return", Seite 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
}
Der verwirrende Doppelpunkt erscheint in Zeile 7 der Anweisung return 1 : 2
. Ich habe keine Ahnung, was es sein könnte. Es ist kein Label oder ternärer Operator.
Es scheint wie ein bedingter ternärer Operator ohne das erste Mitglied (und ohne das ?
), aber in diesem Fall verstehe ich nicht, wie es ohne eine Bedingung funktionieren könnte.
Antworten:
Es ist ein Tippfehler im Buch. Schauen Sie sich Errata für den 2. und 3. Druck der C ++ - Programmiersprache an . Das Beispiel muss wie folgt aussehen:
quelle
(y)
und nicht nury
?(cond) ? a : b
aus Gründen der Klarheit - es hilft mir, Fehlinterpretationen zu vermeiden, z.foo = x > y ? a : b
B.foo = x ...
beim Durchblättern von Code.Sieht für mich aus wie ein einfacher Tippfehler. Sollte wohl sein:
Beachten Sie, dass die Parens optional sind, da das Lambda keine Parameter akzeptiert. Sie können dies stattdessen verwenden, wenn Sie es vorziehen:
quelle
return 1 : 2;
ist ein Syntaxfehler, es ist kein gültiger Code.Eine korrekte Aussage wäre eher so
return (y) ? 1 : 2;
.quelle