Quelle est cette expression de sourire à la barbe: "<:] {%>"?

300

Je suis tombé sur le programme suivant, qui se compile sans erreurs ni même avertissements:

int main(){
  <:]{%>; // smile!
}

Exemple en direct.

Que fait le programme et quelle est cette expression souriante?

Xeo
la source
44
J'ai donné quelque chose dans ce sens à un cours de programmation en bonus. Je suis mauvais, je sais. C'est très inaccessible sur Google.
chris
57
Belle circonlocution; J'entends qu'ils vous poursuivent pour avoir dit "intolérable".
mat
3
@matt Ils ont poursuivi sueeden: bbc.com/news/magazine-21956743
Edward
2
Pourriez-vous s'il vous plaît envisager de changer la réponse acceptée?
nhahtdh
4
@Mysticial: Les réponses amusantes sont amusantes, mais en fin de compte, cela n'aide pas vraiment les lecteurs.
nhahtdh

Réponses:

292

C'est un lambda vide utilisant un déguisement digraphique. Les lambdas normaux n'ont pas de barbe.

R. Martinho Fernandes
la source
354

Le programme utilise des digraphes pour représenter les éléments suivants:

[] {};

C'est une expression lambda qui ne fait rien. Les symboles correspondants ont ces équivalents:

<: = [
%> = }

Bien qu'ils soient généralement inutiles aujourd'hui, les digraphes sont utiles lorsque votre clavier n'a pas certaines touches nécessaires pour utiliser le jeu de caractères source de base de C ++, à savoir les graphiques. La combinaison des caractères qui composent un digraphe est traitée comme un seul jeton. Cela compense à son tour les claviers insuffisamment équipés ou tout autre matériel ou logiciel de ce type.

0x499602D2
la source
66

Le programme utilise des digraphes , qui permettent la programmation C ++ avec des claviers (ou des encodages de texte) qui peuvent ne pas avoir les caractères que C ++ utilise généralement.

Le code se résout à ceci:

int main(){
  []{}; // smile!
}
Drew Dormann
la source
61
int main(){
  <:]{%>; // smile!
}

Il s'agit essentiellement d'une expression Lambda (l' expression Lambda est l'une des fonctionnalités de C ++ 11 ) utilisant des digraphes (les digraphes et les trigraphes fonctionnent en C ++):

[] {};

En utilisant uniquement des digraphes:

<:]<%}; 

<:]<%%>;

[:>{%>; // like my cubic hat?

[:><%};

[:><%%>;

Les mélanger avec des Trigraphs:

<:??)<%??>; // popeye

??(:>{??>; // pirate
Khaled.K
la source