演算子の代替表現
C++ (および C) のソースコードは ISO 646:1983 の共通文字集合を含む任意の非 ASCII 7 ビット文字で書くことができます。 しかし、いくつかの C++ の演算子および記号は ISO 646 の符号化集合の範囲外の文字 ({, }, [, ], #, \, ^, |, ~) を必要とします。 これらの記号の一部または全部が存在しない文字エンコーディング (ドイツ語の DIN 66003 など) を使用可能とするために、 C++ は ISO 646 互換の文字を組み合わせた以下の代替表現を定義しています。
代替トークン
非 ISO 646 文字を使用するいくつかの演算子およびその他のトークンに対する代替表現があります。 各代替トークンは、言語のあらゆる点において、その綴りを除き、その主トークンとまったく同じ動作をします (文字列化演算子はその綴りを可視化できます)。 2文字の代替トークンは「ダイグラフ」と呼ばれることもあります。
| 主トークン | 代替トークン |
|---|---|
&&
|
and
|
&=
|
and_eq
|
&
|
bitand
|
|
|
bitor
|
~
|
compl
|
!
|
not
|
!=
|
not_eq
|
| || | or |
|=
|
or_eq
|
^
|
xor
|
^=
|
xor_eq
|
{ |
<%
|
} |
%>
|
[ |
<:
|
] |
:>
|
# |
%:
|
## |
%:%:
|
|
パーサが文字シーケンス |
(C++11以上) |
ノート
文字 & および ! は ISO 646 の共通部分ですが、さらに制限の厳しい歴史的な文字集合に適合するために、これらの文字を使用する演算子に対しても代替表現が提供されます。
文字 = はサポートされているすべての文字集合に存在していたため、等しい演算子 == のための代替表現 (eq みたいな) はありません。
C との互換性
同じ単語が C プログラミング言語ではインクルードファイル <iso646.h> でマクロとして定義されています。 C++ ではこれらは言語に組み込まれているため、 C++ 版の <iso646.h> および <ciso646> は何も定義しません。
トライグラフ (C++17で削除)
以下の3文字のグループ (トライグラフ) はコメントおよび文字列リテラルが認識される前に解析され、各トライグラフの出現は対応する主文字で置き換えられます。
| 主文字 | トライグラフ |
|---|---|
{ |
??<
|
} |
??>
|
[ |
??(
|
] |
??)
|
# |
??=
|
\ |
??/
|
^ |
??'
|
| |
??!
|
~ |
??-
|
トライグラフは早期に処理されるため、 // 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<::>)
<%
// 参照キャプチャ付きのラムダ
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言語リファレンス
|