名前空間
変種
操作

代替演算子表現

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 

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 ドキュメント
English 日本語 中文(简体) 中文(繁體)