运算符的替代表示
C++(和 C)源代码可以用任何非 ASCII 7 位字符集编写,只要该字符集包含 ISO 646:1983 不变字符集。但是,一些 C++ 运算符和标点符号需要不在 ISO 646 代码集中的字符:{, }, [, ], #, \, ^, |, ~
。为了能够使用某些或所有这些符号不存在的字符编码(例如德语 DIN 66003),C++ 定义了以下由 ISO 646 兼容字符组成的替代方案。
内容 |
[编辑] 替代标记
一些运算符和其他标记的拼写方式存在替代方式,这些替代方式使用非 ISO646 字符。在语言的所有方面,每个替代标记的行为与它的主标记完全相同,除了它的拼写方式(字符串化运算符 可以使拼写方式可见)。两个字母的替代标记有时被称为“二字符组”。尽管有四个字母长,%:%: 也被认为是二字符组。
主 | 替代 |
---|---|
&&
|
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 文档 针对 替代运算符和标记
|