Me deparei com o seguinte programa, que compila sem erros ou mesmo avisos:
int main(){
<:]{%>; // smile!
}
O que o programa faz e qual é essa expressão sorridente?
Me deparei com o seguinte programa, que compila sem erros ou mesmo avisos:
int main(){
<:]{%>; // smile!
}
O que o programa faz e qual é essa expressão sorridente?
Respostas:
É um lambda vazio usando um disfarce de dígrafo. Lambdas normais não têm barbas.
O programa usa dígrafos para representar o seguinte:
[] {};
Esta é uma expressão lambda que não faz nada. Os símbolos correspondentes têm estes equivalentes:
<: = [
%> = }
Embora eles geralmente sejam desnecessários hoje em dia, os digrafos são úteis quando o teclado não possui certas teclas necessárias para usar o conjunto de caracteres de origem básico do C ++, ou seja, os gráficos. A combinação dos caracteres que compõem um dígrafo é processada como um único token. Isso, por sua vez, compensa os teclados insuficientemente equipados ou outro tipo de hardware ou software.
O programa está usando dígitos , que permitem a programação C ++ com teclados (ou codificações de texto) que podem não ter os caracteres que o C ++ normalmente usa.
O código resolve isso:
int main(){
[]{}; // smile!
}
int main(){ <:]{%>; // smile! }
É basicamente uma expressão Lambda (a expressão Lambda é um dos recursos do C ++ 11 ) usando digrafos (ambos os digrafos e trigramas funcionam em C ++):
[] {};
Usando apenas dígrafos:
<:]<%};
<:]<%%>;
[:>{%>; // like my cubic hat?
[:><%};
[:><%%>;
Misturando-os com Trigraphs:
<:??)<%??>; // popeye
??(:>{??>; // pirate