代替演算子表現
C++ (および C) のソースコードは、ISO 646:1983 不変文字セットを含む任意の非 ASCII 7 ビット文字セットで記述できます。しかし、いくつかの C++ 演算子と区切り文字は、ISO 646 コードセットの範囲外の文字を必要とします: {, }, [, ], #, \, ^, |, ~。これらの記号の一部またはすべてが存在しない文字エンコーディング (ドイツの DIN 66003 など) を使用できるようにするため、C++ は ISO 646 互換文字で構成される以下の代替を定義しています。
目次 |
[編集] 代替トークン
非 ISO646 文字を使用するいくつかの演算子やその他のトークンには、代替の表記があります。言語のあらゆる点で、各代替トークンは、その表記(文字列化演算子で表記を見えるようにできます)を除いて、その主トークンとまったく同じように動作します。2 文字の代替トークンは「二文字表記」と呼ばれることもあります。4 文字の長さにもかかわらず、%:%: も二文字表記と見なされます。
| 主 | 代替 (Alternative) |
|---|---|
&&
|
および |
&=
|
and_eq |
&
|
bitand |
|
|
bitor |
~
|
compl |
!
|
not |
!=
|
not_eq |
||
|
or |
|=
|
or_eq |
^
|
xor |
^=
|
xor_eq |
{ |
<%
|
} |
%>
|
[ |
<:
|
] |
:>
|
# |
%:
|
## |
%:%:
|
[編集] 三文字表記 (C++17 で削除)
以下の 3 文字のグループ (三文字表記) は、コメントと文字列リテラルが認識される前に解析され、三文字表記の各出現は対応する主文字に置き換えられます。
| 主 | 三文字表記 |
|---|---|
{ |
??<
|
} |
??>
|
[ |
??(
|
] |
??)
|
# |
??=
|
\ |
??/
|
^ |
??'
|
| |
??!
|
~ |
??-
|
三文字表記は早い段階で処理されるため、// Will the next line be executed?????/ のようなコメントは実質的に次の行をコメントアウトし、"Enter date ??/??/??" のような文字列リテラルは "Enter date \\??" と解析されます。
[編集] 注記
文字 & と ! は ISO-646 の下では不変ですが、これらの文字を使用するトークンには、より制限の厳しい歴史的な文字セットにも対応するために、代替が提供されています。
等号演算子 == には代替の表記 (eq など) はありません。なぜなら、文字 = はすべてのサポートされている文字セットに存在したからです。
[編集] C との互換性
同じ語句は、C プログラミング言語ではインクルードファイル <iso646.h> でマクロとして定義されています。C++ ではこれらは言語に組み込まれているため、<iso646.h> の C++ バージョンと <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 standard (ISO/IEC 14882:2020)
- 5.5 代替トークン [lex.digraph]
- C++17 standard (ISO/IEC 14882:2017)
- 5.5 代替トークン [lex.digraph]
- C++14 standard (ISO/IEC 14882:2014)
- 2.4 三文字表記シーケンス [lex.trigraph]
- 2.6 代替トークン [lex.digraph]
- C++11 standard (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 ドキュメント
|