Namespaces
Variants

Alternative operator representations

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Le code source C++ (et C) peut être écrit dans n'importe quel jeu de caractères 7 bits non-ASCII qui inclut le jeu de caractères invariant ISO 646:1983 . Cependant, plusieurs opérateurs et ponctuateurs C++ nécessitent des caractères qui sont en dehors du jeu de codes ISO 646 : {, }, [, ], #, \, ^, |, ~ . Pour pouvoir utiliser des encodages de caractères où certains ou tous ces symboles n'existent pas (comme l'allemand DIN 66003 ), C++ définit les alternatives suivantes composées de caractères compatibles ISO 646.

Table des matières

Tokens alternatifs

Il existe des orthographes alternatives pour plusieurs opérateurs et autres jetons utilisant des caractères non-ISO646. Dans tous les aspects du langage, chaque jeton alternatif se comporte exactement comme son jeton principal, à l'exception de son orthographe (l' opérateur de stringification peut rendre l'orthographe visible). Les jetons alternatifs à deux lettres sont parfois appelés "digrammes". Bien qu'il soit composé de quatre lettres, % : % : est également considéré comme un digramme.

Principal Alternatif
&& and
&= and_eq
& bitand
| bitor
~ compl
! not
!= not_eq
|| or
|= or_eq
^ xor
^= xor_eq
{ <%
} %>
[ <:
] :>
# %:
## %:%:

Trigraphs (supprimés en C++17)

Les trois groupes de caractères suivants (trigraphes) sont analysés avant que les commentaires et les littéraux de chaîne ne soient reconnus , et chaque apparition d'un trigraphe est remplacée par le caractère principal correspondant :

Principal Trigraphe
{ ??<
} ??>
[ ??(
] ??)
# ??=
\ ??/
^ ??'
| ??!
~ ??-

Étant donné que les trigraphes sont traités tôt, un commentaire tel que // Will the next line be executed?????/ commentera effectivement la ligne suivante, et le littéral de chaîne tel que "Enter date ??/??/??" est analysé comme "Enter date \\ ??" .

Notes

Les caractères & et ! sont invariants sous ISO-646, mais des alternatives sont fournies pour les jetons qui utilisent ces caractères afin de s'adapter aux jeux de caractères historiques encore plus restrictifs.

Il n'existe pas d'orthographe alternative (telle que eq ) pour l'opérateur d'égalité == car le caractère = était présent dans tous les jeux de caractères pris en charge.

Compatibilité avec C

Les mêmes mots sont définis dans le langage de programmation C dans le fichier d'en-tête <iso646.h> comme des macros. Parce qu'en C++ ceux-ci sont intégrés au langage, la version C++ de <iso646.h> , ainsi que <ciso646> , ne définit rien. Les digrammes non alphabétiques (par exemple < % ), cependant, font partie du langage de base et peuvent être utilisés sans inclure aucun en-tête (sinon, ils seraient inutilisables sur tout jeu de caractères dépourvu de # ).

Mots-clés

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

Exemple

L'exemple suivant démontre l'utilisation de plusieurs jetons alternatifs.

%: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");
%>

Sortie possible :

Hello Anon from ./a.out

Références

  • Norme C++23 (ISO/CEI 14882:2024) :
  • 5.5 Jetons alternatifs [lex.digraph]
  • Norme C++20 (ISO/CEI 14882:2020) :
  • 5.5 Jetons alternatifs [lex.digraph]
  • Norme C++17 (ISO/CEI 14882:2017) :
  • 5.5 Jetons alternatifs [lex.digraph]
  • Norme C++14 (ISO/CEI 14882:2014) :
  • 2.4 Séquences de trigraphes [lex.trigraph]
  • 2.6 Jetons alternatifs [lex.digraph]
  • Norme C++11 (ISO/CEI 14882:2011) :
  • 2.4 Séquences trigraphes [lex.trigraph]
  • 2.6 Jetons alternatifs [lex.digraph]
  • Norme C++03 (ISO/CEI 14882:2003) :
  • 2.3 Séquences trigraphes [lex.trigraph]
  • 2.5 Jetons alternatifs [lex.digraph]
  • Norme C++98 (ISO/CEI 14882:1998) :
  • 2.3 Séquences de trigraphes [lex.trigraph]
  • 2.5 Jetons alternatifs [lex.digraph]

Voir aussi

Documentation C pour Opérateurs et jetons alternatifs