Альтернативные представления операторов
Исходный код 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