Spec-Zone.ru › C++

Альтернативные представления операторов

Исходный код C++ (и C) может быть написан в любой 7-битной кодировке символов, не относящейся к ASCII, которая включает инвариантный набор символов ISO 646:1983. Однако для некоторых операторов и знаков пунктуации C++ требуются символы, отсутствующие в кодировке ISO 646: {, }, [, ], #, \, ^, |, ~. Чтобы можно было использовать кодировки символов, в которых некоторые или все эти символы отсутствуют (например, немецкую DIN 66003), в C++ определены следующие альтернативы, составленные из символов, совместимых с ISO 646.

Альтернативные токены

Для некоторых операторов и других токенов, использующих символы, отсутствующие в ISO 646, предусмотрены альтернативные написания. Во всех отношениях языка каждый альтернативный токен ведёт себя точно так же, как соответствующий основной токен, и отличается от него только написанием (оператор преобразования в строку позволяет увидеть написание). Двухбуквенные альтернативные токены иногда называют «диграфами». Несмотря на то что %:%: состоит из четырёх букв, его тоже считают диграфом.

Основной токен Альтернативный токен
&& and
&= and_eq
& bitand
| bitor
~ compl
! not
!= not_eq
|| or
|= or_eq
^ xor
^= xor_eq
{ <%
} %>
[ <:
] :>
# %:
## %:%:

Триграфы (удалены в C++17)

Следующие группы из трёх символов (триграфы) обрабатываются до распознавания комментариев и строковых литералов, и каждое вхождение триграфа заменяется соответствующим основным символом:

Основной символ Триграф
{ ??<
} ??>
[ ??(
] ??)
# ??=
\ ??/
^ ??'
| ??!
~ ??-

Поскольку триграфы обрабатываются на раннем этапе, комментарий вроде // Will the next line be executed?????/ фактически закомментирует следующую строку, а строковый литерал вроде "Enter date ??/??/??" будет разобран как "Enter date \\??".

Примечания

Символы & и ! являются инвариантными в ISO 646, но альтернативы предусмотрены и для токенов, использующих эти символы, чтобы поддержать ещё более ограниченные исторические кодировки.

Для оператора равенства == нет альтернативного написания (например, eq), поскольку символ = присутствовал во всех поддерживаемых кодировках.

Совместимость с C

Те же слова определены в языке программирования C в заголовочном файле <iso646.h> в виде макросов. Поскольку в C++ они встроены в язык, версия C++ заголовка <iso646.h>, как и <ciso646>, ничего не определяет. Однако диграфы, не являющиеся словами (например, <%), входят в ядро языка и могут использоваться без подключения заголовочного файла (иначе их нельзя было бы использовать в кодировках, не содержащих #).

Ключевые слова

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

Пример

В следующем примере показано использование нескольких альтернативных токенов.

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

Возможный вывод:

Hello Anon from ./a.out

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2024):
    • 5.5 Альтернативные токены [lex.digraph]
  • Стандарт C++20 (ISO/IEC 14882:2020):
    • 5.5 Альтернативные токены [lex.digraph]
  • Стандарт C++17 (ISO/IEC 14882:2017):
    • 5.5 Альтернативные токены [lex.digraph]
  • Стандарт C++14 (ISO/IEC 14882:2014):
    • 2.4 Последовательности триграфов [lex.trigraph]
    • 2.6 Альтернативные токены [lex.digraph]
  • Стандарт C++11 (ISO/IEC 14882:2011):
    • 2.4 Последовательности триграфов [lex.trigraph]
    • 2.6 Альтернативные токены [lex.digraph]
  • Стандарт C++03 (ISO/IEC 14882:2003):
    • 2.3 Последовательности триграфов [lex.trigraph]
    • 2.5 Альтернативные токены [lex.digraph]
  • Стандарт C++98 (ISO/IEC 14882:1998):
    • 2.3 Последовательности триграфов [lex.trigraph]
    • 2.5 Альтернативные токены [lex.digraph]

См. также

Документация по C о альтернативных операторах и токенах

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/operator_alternative

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API