Alternative operator representations
El código fuente de C++ (y C) puede escribirse en cualquier conjunto de caracteres de 7 bits no ASCII que incluya el
ISO 646:1983
conjunto de caracteres invariante. Sin embargo, varios operadores y puntuadores de C++ requieren caracteres que están fuera del conjunto de códigos ISO 646:
{, }, [, ], #, \, ^, |, ~
. Para poder utilizar codificaciones de caracteres donde algunos o todos estos símbolos no existen (como el
DIN 66003
alemán), C++ define las siguientes alternativas compuestas por caracteres compatibles con ISO 646.
Contenidos |
Tokens alternativos
Existen grafías alternativas para varios operadores y otros tokens que utilizan caracteres no ISO646. En todos los aspectos del lenguaje, cada token alternativo se comporta exactamente igual que su token principal, excepto por su grafía (el operador de stringificación puede hacer visible la grafía). Los tokens alternativos de dos letras a veces se denominan "dígrafos". A pesar de tener cuatro letras, % : % : también se considera un dígrafo.
| Principal | Alternativo |
|---|---|
&&
|
and |
&=
|
and_eq |
&
|
bitand |
|
|
bitor |
~
|
compl |
!
|
not |
!=
|
not_eq |
||
|
or |
|=
|
or_eq |
^
|
xor |
^=
|
xor_eq |
{
|
<%
|
}
|
%>
|
[
|
<:
|
]
|
:>
|
#
|
%:
|
##
|
%:%:
|
Trigraphs (eliminados en C++17)
Los siguientes grupos de tres caracteres (trigráficos) son analizados antes de que se reconozcan los comentarios y literales de cadena , y cada aparición de un trigráfico es reemplazada por el carácter primario correspondiente:
| Primario | Trígrafo |
|---|---|
{
|
??<
|
}
|
??>
|
[
|
??(
|
]
|
??)
|
#
|
??=
|
\
|
??/
|
^
|
??'
|
|
|
??!
|
~
|
??-
|
Debido a que los trigramas se procesan tempranamente, un comentario como // Will the next line be executed?????/ efectivamente comentará la siguiente línea, y el literal de cadena como "Enter date ??/??/??" se analiza como "Enter date \\ ??" .
Notas
Los caracteres & y ! son invariantes bajo ISO-646, pero se proporcionan alternativas para los tokens que utilizan estos caracteres de todos modos para adaptarse a conjuntos de caracteres históricos aún más restrictivos.
No existe una ortografía alternativa (como eq ) para el operador de igualdad == porque el carácter = estaba presente en todos los juegos de caracteres admitidos.
Compatibilidad con C
Las mismas palabras están definidas en el lenguaje de programación C en el archivo de inclusión <iso646.h> como macros. Debido a que en C++ estas están incorporadas en el lenguaje, la versión de C++ de <iso646.h> , así como <ciso646> , no define nada. Los dígrafos no-palabra (por ejemplo < % ), sin embargo, son parte del lenguaje núcleo y pueden usarse sin incluir ningún encabezado (de lo contrario, no serían utilizables en cualquier juego de caracteres que carezca de # ).
Palabras clave
and , and_eq , bitand , bitor , compl , not , not_eq , or , or_eq , xor , xor_eq
Ejemplo
El siguiente ejemplo demuestra el uso de varios tokens alternativos.
%:include <iostream> struct X <% compl X() <%%> // destructor X() <%%> X(const X bitand) = delete; // copy constructor // X(X and) = delete; // move constructor bool operator not_eq(const X bitand other) <% return this not_eq bitand other; %> %>; int main(int argc, char* argv<::>) <% // lambda with reference-capture: auto greet = <:bitand:>(const char* name) <% std::cout << "Hello " << name << " from " << argv<:0:> << '\n'; %>; if (argc > 1 and argv<:1:> not_eq nullptr) greet(argv<:1:>); else greet("Anon"); %>
Salida posible:
Hello Anon from ./a.out
Referencias
- Estándar C++23 (ISO/IEC 14882:2024):
-
- 5.5 Tokens alternativos [lex.digraph]
- Estándar C++20 (ISO/IEC 14882:2020):
-
- 5.5 Tokens alternativos [lex.digraph]
- Estándar C++17 (ISO/IEC 14882:2017):
-
- 5.5 Tokens alternativos [lex.digraph]
- Estándar C++14 (ISO/IEC 14882:2014):
-
- 2.4 Secuencias de trigrafos [lex.trigraph]
-
- 2.6 Tokens alternativos [lex.digraph]
- Estándar C++11 (ISO/IEC 14882:2011):
-
- 2.4 Secuencias de trigrafos [lex.trigraph]
-
- 2.6 Tokens alternativos [lex.digraph]
- Estándar C++03 (ISO/IEC 14882:2003):
-
- 2.3 Secuencias de trigrafos [lex.trigraph]
-
- 2.5 Tokens alternativos [lex.digraph]
- Estándar C++98 (ISO/IEC 14882:1998):
-
- 2.3 Secuencias de trigrafos [lex.trigraph]
-
- 2.5 Tokens alternativos [lex.digraph]
Véase también
|
Documentación de C
para
Operadores y tokens alternativos
|