Reputation: 131789
I came across the following program, which compiles without errors or even warnings:
int main(){
<:]{%>; // smile!
}
What does the program do, and what is that smiley-expression?
Upvotes: 305
Views: 13763
Reputation: 63775
The program is using digraphs, which allow C++ programming with keyboards (or text encodings) that may not have the characters C++ typically uses.
The code resolves to this:
int main(){
[]{}; // smile!
}
Upvotes: 69
Reputation: 96810
The program uses digraphs to represent the following:
[] {};
This is a lambda expression that does nothing. The corresponding symbols have these equivalents:
<: = [
%> = }
Though they are generally unneeded today, digraphs are useful for when your keyboard lacks certain keys necessary to use C++'s basic source character set, namely the graphical ones. The combination of the characters that make up a digraph are processed as a single token. This in turn makes up for any insufficiently-equipped keyboards or other such hardware or software.
Upvotes: 365
Reputation: 5940
int main(){ <:]{%>; // smile! }
It's basically a Lambda expression (Lambda expression is one of C++11 features) using digraphs (both digraphs and trigraphs works on C++):
[] {};
Using only digraphs:
<:]<%};
<:]<%%>;
[:>{%>; // like my cubic hat?
[:><%};
[:><%%>;
Mixing them with Trigraphs:
<:??)<%??>; // popeye
??(:>{??>; // pirate
Upvotes: 62
Reputation: 234444
That's an empty lambda using a digraph disguise. Normal lambdas don't have beards.
Upvotes: 300