Eu não entendo um uso particular de dois pontos.
Encontrei no livro A linguagem de programação C ++ de Bjarne Stroustrup, 4ª edição, seção 11.4.4 "Chamada e retorno", 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
}
Os dois pontos confusos aparecem na linha 7, na declaração return 1 : 2
. Não tenho a menor idéia do que poderia ser. Não é um rótulo ou operador ternário.
Parece um operador ternário condicional sem o primeiro membro (e sem o ?
), mas nesse caso eu não entendo como ele poderia funcionar sem uma condição.
Respostas:
É um erro de digitação no livro. Veja Errata para as 2ª e 3ª impressões da linguagem de programação C ++ . O exemplo deve ser como abaixo:
fonte
(y)
e não apenasy
?(cond) ? a : b
para maior clareza - isso me ajuda a evitar interpretações erradas, por exemplo, a declaraçãofoo = x > y ? a : b
comofoo = x ...
ao percorrer o código.Parece-me um simples erro de digitação. Provavelmente deve ser:
Observe que, como o lambda não aceita nenhum parâmetro, os parênteses são opcionais. Você pode usar isso em vez disso, se preferir:
fonte
return 1 : 2;
é um erro de sintaxe, não é um código válido.Uma declaração correta seria mais parecida com isso
return (y) ? 1 : 2;
.fonte