Espacios de nombres
Variantes
Acciones

Representaciones alternativas de operadores

De cppreference.com
< cpp‎ | language
 
 
Lenguaje C++
Temas generales
Control de flujo
Instrucciones de ejecución condicionales
Instrucciones de iteración (bucles)
Declaraciones de salto
Funciones
Declaración de funciones
Declaración de funciones lambda
Especificador inline
Especificación de excepciones (hasta C++20)
Especificador noexcept (C++11)
Excepciones
Espacios de nombres
Tipos
Especificadores
decltype (C++11)
auto (C++11)
alignas (C++11)
Especificadores de duración de almacenamiento
Inicialización
Expresiones
Representaciones alternas
Literales
Booleanos - Enteros - De punto flotante
De carácter - De cadena - nullptr (C++11)
Definidos por el usuario (C++11)
Utilidades
Atributos (C++11)
Tipos
Declaración de typedef
Declaración de alias de tipo (C++11)
Conversiones
Conversiones implícitas - Conversiones explícitas
static_cast - dynamic_cast
const_cast - reinterpret_cast
Asignación de memoria
Clases
Propiedades de funciones específicas de la clase
Funciones miembro especiales
Plantillas
Misceláneos
 

En C++ (y C) el código fuente puede estar escrito en cualquier conjunto de carácteres no ASCII de 7 bits, que incluye el conjunto de caracteres invariante ISO 646/ECMA-6. Sin embargo, varios operadores de C++ y puntuaciones requieren caracteres que se encuentran fuera del juego de códigos ISO 646: {, }, [, ], #, \, ^, |, ~. Para poder utilizar una codificación de caracteres donde algunos o todos estos tókenes no existen, C++ define las siguientes alternativas, compuestas de carácteres compatibles con ISO 646.

Contenido

[editar] Tókenes alternativos

Hay ortografías alternativas para varios operadores y otros tókenes que usan caracteres que no son ISO646. En todos los aspectos del lenguaje, cada token alternativo se comporta exactamente igual que su token primario, excepto por su ortografía (el operador para convertir a una cadena puede hacer que la ortografía sea visible). Los tókenes primarios de dos letras a veces se llaman "dígrafos".

Primario Alternativo
&& and
&= and_eq
& bitand
| bitor
~ compl
! not
!= not_eq
|| or
|= or_eq
^ xor
^= xor_eq

Cuando el analizador encuentra la secuencia de caracteres <:: y el carácter posterior no es ni : ni >, el < se trata como un token de preprocesamiento por sí mismo y no como el primer carácter del token alternativo <:. Por lo tanto, std::vector<::std::string> no se tratará erróneamente como std::vector[:std::string>.

(desde C++11)

[editar] Notas

Los caracteres & y !} son invariables bajo ISO-646, pero se proporcionan alternativas para los tókenes que usan estos caracteres de todos modos para acomodar conjuntos históricos aún más restrictivos .

No hay una ortografía alternativa (como eq) para el operador de igualdad == porque el carácter = estaba presente en todos los juegos de caracteres soportados.

[editar] Compatibilidad con C

Las mismas palabras se definen en el lenguaje de programación C, en el archivo de encabezado <iso646.h>, como macros. Debido a que en C++ están integrados en el lenguaje, la versión C++ de <iso646.h>, así como <ciso646>, no define nada.

[editar] Trígrafos (eliminado en C++17)

Los siguientes grupos de tres caracteres (trígrafos) se analizan antes de que se reconozcan los comentarios y los literales de cadena, y cada aparición de un trígrafo se reemplaza por el carácter primario correspondiente:

Primario Trígrafo
{ ??<
} ??>
[ ??(
] ??)
# ??=
\ ??/
^ ??'
| ??!
~ ??-

Debido a que los trígrafos se procesan temprano, un comentario como // Se ejecutará la siguiente línea?????/ efectivamente comentará la siguiente línea y un literal de cadena como "Ingrese la fecha ??/??/??" se analiza como "Ingrese la fecha \\??"

[editar] Palabras clave

and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq

[editar] Ejemplo

El siguiente ejemplo demuestra el uso de varios tókenes alternativos.

%:include <iostream>
 
struct X
<%
    compl X() <%%> // destructor
    X() <%%>
    X(const X bitand) = delete; // constructor de copia
 
    bool operator not_eq(const X bitand other)
    <%
       return this not_eq bitand other;
    %>
%>;
 
int main(int argc, char* argv<::>) 
<%
    // lambda con captura por referencia:
    auto saludar = <:bitand:>(const char* nombre)
    <%
        std::cout << "Hola " << nombre
                  << " de parte de " << argv<:0:> << '\n';
    %>;
 
    if (argc > 1 and argv<:1:> not_eq nullptr) <%
        saludar(argv<:1:>);
    %>
%>


[editar] Véase también

Documentación de C para Operadores alternativos y tókenes