No entiendo un uso particular de un colon.
Lo encontré en el libro El lenguaje de programación C ++ de Bjarne Stroustrup, cuarta edición, sección 11.4.4 "Llamada y devolución", página 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
}
Los dos puntos confusos aparecen en la línea 7, en la declaración return 1 : 2. No tengo idea de lo que podría ser. No es una etiqueta ni un operador ternario.
Parece un operador ternario condicional sin el primer miembro (y sin el ?), pero en ese caso no entiendo cómo podría funcionar sin una condición.

Respuestas:
Es un error tipográfico en el libro. Mire Errata para las impresiones segunda y tercera del lenguaje de programación C ++ . El ejemplo debe ser el siguiente:
fuente
(y)y no soloy?(cond) ? a : bpara mayor claridad: me ayuda a evitar la lectura errónea, por ejemplo, la declaraciónfoo = x > y ? a : bcomofoo = x ...al leer el código.Me parece un simple error tipográfico. Probablemente debería ser:
Tenga en cuenta que, dado que la lambda no toma ningún parámetro, los parens son opcionales. Puede usar esto en su lugar, si lo prefiere:
fuente
return 1 : 2;es un error de sintaxis, no es un código válido.Una declaración correcta sería más como en su
return (y) ? 1 : 2;lugar.fuente