替用运算符表示

来自cppreference.com
< cpp‎ | language
 
 
 
表达式
概述
值类别(左值 lvalue 、右值 rvalue 、亡值 xvalue )
求值顺序(序列点)
常量表达式
不求值表达式
初等表达式
lambda 表达式(C++11)
字面量
整数字面量
浮点字面量
布尔字面量
字符字面量,包含转义序列
字符串字面量
空指针字面量(C++11)
用户定义字面量(C++11)
运算符
赋值运算符a=b, a+=b, a-=b, a*=b, a/=b, a%=b, a&=b, a|=b, a^=b, a<<=b, a>>=b
自增与自减++a, --a, a++, a--
算术运算符+a, -a, a+b, a-b, a*b, a/b, a%b, ~a, a&b, a|b, a^b, a<<b, a>>b
逻辑运算符a||b, a&&b, !a
比较运算符a==b, a!=b, a<b, a>b, a<=b, a>=b, a<=>b(C++20)
成员访问运算符a[b], *a, &a, a->b, a.b, a->*b, a.*b
其他运算符a(...), a,b, a?b:c
运算符的替代表示
优先级和结合性
折叠表达式(C++17)
new 表达式
delete 表达式
throw 表达式
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
运算符重载
类型转换
隐式转换
const_cast
static_cast
reinterpret_cast
dynamic_cast
显式转换 (T)a, T(a)
用户定义转换
 

C++ (及 C )源代码可以用任何包含 ISO 646:1983 不变字符集的非 ASCII 7 位字符集书写。然而,一些 C++ 运算符及标点要求 ISO 646 编码集外的字符: {, }, [, ], #, \, ^, |, ~ 。为了能够用不存在一些或全部这些符号的字符编码(例如德语 DIN 66003 ), C++ 定义下列由 ISO 646 兼容字符组成的替用写法。

目录

[编辑] 替用记号

使用非 ISO-646 字符的数个运算符和其他记号有替用拼写。在语言的所有方面,每个替用拼写准确表现为其初等记号,除了其拼写(字符串化运算符能使拼写可见)。双字母替用记号有时被称为“双标符 (digraphs) ”。

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

剖析器遇到字符序列 <:: ,且后继字符既非 : 亦非 > 时, < 被当做预处理记号本身,而非替用记号 <: 。从而 std::vector<::std::string> 不会被错误地处理成 std::vector[:std::string>

(C++11 起)

[编辑] 注意

字符 &! 在 ISO-646 下不变,但仍然为这些运算符提供替用写法,以使用这些字符适应更加受限的历史字符集。

没有等于运算符的替用拼写 == (如 eq ),因为字符 = 已在所有受支持字符集中存在。

[编辑] 与 C 的兼容性

同样的关键词在 C 编程语言中被定义成包含于文件 <iso646.h> 的宏。因为 C++ 中它们被建立进语言,故 <iso646.h> 的 C++ 版本还有 <ciso646> 不定义任何内容。

[编辑] 三标符 (C++17 中移除)

下列三字符组(三标符, trigraph )在辨识注释和字符串字面量前分析,而三标符的每次出现被替换为对应的初等字符:

初等 三标符
{ ??<
} ??>
[ ??(
] ??)
# ??=
\ ??/
^ ??'
| ??!
~ ??-

因为三标符在早期处理,如 // 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

[编辑] 示例

下列示例演示各种替用记号的使用。

%:include <iostream>
 
struct X
<%
    compl X() <%%> // 析构函数
    X() <%%>
    X(const X bitand) = delete; // 复制构造函数
 
    bool operator not_eq(const X bitand other)
    <%
       return this not_eq bitand other;
    %>
%>;
 
int main(int argc, char* argv<::>) 
<%
    // 带引用捕获的 lambda
    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:>);
    %>
%>


[编辑] 参阅

替用运算符表示C 文档