Альтернативные представления операторов
Код на C++ (и C) может быть написан в любой кодировке символов, отличной от ASCII 7-битной, которая включает набор символов 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 |
{ |
<% |
} |
%> |
[ |
<: |
] |
:> |
# |
%: |
## |
%:%: |
Когда последовательность символов <:: не следует за : или >, символ < обрабатывается как препроцессорный токен сам по себе, а не как первый символ альтернативного токена <:. Таким образом, std::vector<::std::string> не будет неправильно обрабатываться как std::vector[:std::string>.
Примечания
Символы & и ! являются неизменными в ISO-646, но альтернативы предоставляются для токенов, которые все же используют эти символы, чтобы адаптироваться к еще более строгим историческим наборам символов.
Нет альтернативного написания (например, eq) для оператора равенства ==, потому что символ = присутствовал во всех поддерживаемых наборах символов.
Совместимость с C
Те же слова определены в языке программирования C в файле заголовка <iso646.h> как макросы. Поскольку в C++ они являются встроенными в язык, C++ версия <iso646.h>, а также <ciso646> ничего не определяет. Однако несловные диграфы (например, <%) являются частью основного языка и могут использоваться без включения какого-либо заголовка (в противном случае они были бы непригодны в любом наборе символов, которому не хватает #).
Пример
Следующий пример демонстрирует использование нескольких альтернативных токенов.
%: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++17)
Следующие три группы символов (триграфы) обрабатываются до распознавания комментариев и строковых литералов, и каждая встреча триграфа заменяется соответствующим основным символом:
| Основной | Триграф |
|---|---|
{ |
??< |
| } |
??> |
[ |
??( |
] |
??) |
# |
??= |
\ |
??/ |
^ |
??' |
| |
??! |
~ |
??- |
Поскольку триграфы обрабатываются на ранней стадии, комментарий, такой как // Will the next line be executed?????/ , фактически закомментирует следующую строку, а строковая константа, такая как "Enter date ??/??/??" , будет обработана как "Enter date \\??".
Ключевые слова
and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq
Отчёты о дефектах
Следующие отчёты о дефектах, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, опубликованное как | Правильное поведение |
|---|---|---|---|
| CWG 1104 | C++98 | альтернативный токен <: привёл к тому, что std::vector<::std::string> обрабатывался как std::vector[:std::string> | добавлено дополнительное правило лексического анализа для решения этого случая |
См. также
| C документация по Альтернативные операторы и токены |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/operator_alternative