Its call alternative tokens. C++ have several of them:
<% {
%> }
<: [
:> ]
%: #
%:%: ##
and &&
bitor |
or ||
xor ˆ
compl ~
bitand &
and_eq &=
or_eq |=
xor_eq ˆ=
not !
not_eq !=
You can seen some of the alternative token consists of letters. So you can write if (a<b and b<c)
in a compiler which can correctly handle them. Their existence is for lack of symbols in keyboards or character sets. The alternative tokens are never replaced with the primary one (unlike trigraphs), but them behave the same as the primary one.
However, C++0x require special treatment for <::
(2.5p3):
Otherwise, if the next three characters are <:: and the subsequent
character is neither : nor >, the < is treated as a preprocessor token
by itself and not as the first character of the alternative token <:.
So that SomeTemplate<::SomeClass>
can be correctly handled.