識別子
識別子は、数字、アンダースコア、ラテン文字の小文字と大文字、およびほとんど�� Unicode 文字 (詳細は下を参照してください) の任意長の並びです。 有効な識別子は数字以外の文字 (ラテン文字、アンダースコア、または Unicode の数字以外の文字) で始まらなければなりません。 識別子は大文字と小文字が区別され、すべての文字が有意です。
ノート: C++ の文法は、形式的には Unicode 文字が \u
または \U
でエスケープされることを要求していますが、翻訳フェーズ1のため、それはソースコードから生の Unicode 文字がどのようにコンパイラに渡されるかという問題そのものです。 この機能のサポートは制限されるかもしれないことにも注意してください (例: gcc)。
目次 |
[編集] 宣言内で
識別子はオブジェクト、参照、関数、列挙、型、クラスメンバ、名前空間、テンプレート、テンプレートの特殊化、パラメータパック、 goto のラベル、およびその他のエンティティに名前を付けるために使用できます。 ただし以下の例外があります。
- キーワードである識別子は、それ以外の目的に使用することはできません。
- いずれかの場所に二重のアンダースコアを持つ識別子は予約されています。
- アンダースコアで始まりその直後に大文字が続く識別子は予約されています。
- アンダースコアで始まる識別子はグローバル名前空間では予約されています。
ここでいう「予約されています」は、標準ライブラリヘッダが内部使用のためにそのような識別子を #define または宣言するかもしれない、コンパイラがそのような種類の非標準の識別子を事前定義するかもしれない、および名前マングリングアルゴリズムがそのような識別子が使用されていないことを仮定しているかもしれない、という意味です。 プログラマがそのような識別子を使用した場合、動作は未定義です。
また、キーワードと同一の名前を #define または #undef することは未定義動作です。 標準ライブラリヘッダを少なくともひとつインクルードする場合、いかなる標準ライブラリヘッダで宣言されている名前とも同一の識別子を #define または #undef することは未定義動作です。
This section is incomplete Reason: +other contents of 17.6.4.3 [reserved.names] |
[編集] 式内で
変数、関数、コンセプトの特殊化 (C++20以上)、または列挙子を表す識別子は、式として使用できます。 識別子だけから構成される式の結果は、その識別子によって表されるエンティティです。 式の値カテゴリは、識別子が関数、変数、テンプレート引数オブジェクト (C++20以上)、またはデータメンバであれば lvalue、そうでなければ prvalue です (例えば、列挙子は prvalue 式、コンセプトの特殊化は bool の prvalue (C++20以上)です)。 式の型は以下のように決定されます。
void f() { float x, &r = x; [=] { decltype(x) y1; // y1 は float 型です。 decltype((x)) y2 = y1; // y2 は float const& 型 (ラムダのため) であり、 // 変更可能ではありません。 x は lvalue です。 decltype(r) r1 = y1; // r1 は float& 型です。 decltype((r)) r2 = y2; // r2 は float const& 型です。 }; } |
(C++11以上) |
|
(C++20以上) |
- そうでなければ、式の型は表されたエンティティの型と同じです。
非静的メンバ関数の本体内では、非静的メンバを表す識別子は、すべてクラスメンバアクセス式 this->member に暗黙に変換されます。
[編集] 非修飾識別子
適切に宣言された識別子の他に、以下のものが式内で同じ役割で使用���きます。
- 関数表記のオーバーロード演算子の名前 (operator+ や operator new など)。
- ユーザ定義変換関数の名前 (operator bool など)。
- ユーザ定義リテラル演算子の名前 (operator "" _km など)。
- テンプレートの名前の後にその実引数リストが続いたもの (MyTemplate<int> など)。
- 文字 ~ の後にクラス名が続いたもの (~MyClass など)。
- 文字 ~ の後に decltype 指定子が続いたもの (~decltype(str) など)。
識別子と合わせて、これらは非修飾識別子式と言います。
[編集] 修飾識別子
修飾識別子式は、スコープ解決演算子 :: および、オプショナルな列挙、 (C++11以上)クラスまたは名前空間の名前または decltype 式 (C++11以上)のスコープ解決演算子で区切られた並びを、非修飾識別子式の前に付けたものです。 例えば、式 std::string::npos は名前空間 std 内のクラス string 内の静的メンバ npos を表す式です。 式::tolower はグローバル名前空間内の関数 tolower を表します。 式 ::std::cout はトップレベル名前空間である名前空間 std 内のグローバル変数 cout を表します。 式 boost::signals2::connection は名前空間 boost 内で宣言された名前空間 signals2 内で宣言された型 connection を表します。
依存テンプレート名の曖昧性を解消するために必要に応じて修飾識別子内にキーワード template が現れることがあります。
修飾識別子に対する名前探索の詳細については修飾名の名前探索を参照してください。
[編集] 名前
名前はエンティティまたはラベルを参照するための以下のいずれかの使用です。
- 識別子。
- 関数表記のオーバーロード演算子の名前 (operator+、 operator new など)。
- ユーザ定義変換関数の名前 (operator bool など)。
- ユーザ定義リテラル演算子の名前 (operator "" _km など)。
- テンプレートの名前の後にその実引数が続いたもの (MyTemplate<int> など)。
エンティティを表すすべての名前は宣言によってプログラム内に導入されます。 ラベルを表すすべての名前は goto 文またはラベル付き文のいずれかによってプログラム内に導入されます。複数の翻訳単位で使用される名前は、リンケージに応じて、同じエンティティを参照するかもしれませんし異なるエンティティを参照するかもしれません。
コンパイラがプログラム内で未知の名前に遭遇したとき、名前探索用いて、その名前を導入した宣言と、その名前を、紐付けます。 ただし、テンプレート宣言または定義内の依存名の場合は除きます (それらの名前の場合は、それらが型を表すのか、テンプレートを表すのか、またはその他の何らかのエンティティを表すのかを決定します。 これは明示的な曖昧性解消を要求する場合があります)。
[編集] 識別子内の Unicode 文字
以下の Unicode 文字範囲は識別子内で使用できます。
コードポイント | 説明 | 文字 |
---|---|---|
U+00A8 | DIARESIS | ¨
|
U+00AA | FEMININE ORDINAL INDICATOR | ª
|
U+00AD | SOFT HYPHEN |
|
U+00AF | MACRON | ¯
|
U+00B2 - U+00B5 | SUPERSCRIPT TWO - MICRO SIGN | ²³´µ
|
U+00B7 - U+00BA | MIDDLE DOT - MASCULINE ORDINAL INDICATOR | ·¸¹º
|
U+00BC - U+00BE | VULGAR FRACTION ONE QUARTER - VULGAR FRACTION THREE QUARTERS | ¼½¾
|
U+00C0 - U+00D6 | LATIN CAPITAL LETTER A WITH GRAVE - LATIN CAPITAL LETTER O WITH DIAERESIS | ÀÁÂ...ÔÕÖ
|
U+00D8 - U+00F6 | LATIN CAPITAL LETTER O WITH STROKE - LATIN SMALL LETTER O WITH DIAERESIS | ØÙÚ...ôõö
|
U+00F8 - U+167F | LATIN SMALL LETTER O WITH STROKE - CANADIAN SYLLABICS BLACKFOOT W | øùú...ᙽᙾᙿ
|
U+1681 - U+180D | OGHAM LETTER BEITH - MONGOLIAN FREE VARIATION SELECTOR THREE | ᚁᚂᚃ...᠋᠌᠍
|
U+180F - U+1FFF | SYRIAC LETTER BETH - GREEK DASIA | ᠏ܒܓ...´῾
|
U+200B - U+200D | ZERO WIDTH SPACE - ZERO WIDTH JOINER |
|
U+202A - U+202E | LEFT-TO-RIGHT EMBEDDING - RIGHT-TO-LEFT OVERRIDE |
|
U+203F - U+2040 | UNDERTIE - CHARACTER TIE | ‿⁀
|
U+2054 | INVERTED UNDERTIE | ⁔
|
U+2060 - U+218F | WORD JOINER - TURNED DIGIT THREE | ...↉↊↋
|
U+2460 - U+24FF | CIRCLED DIGIT ONE - NEGATIVE CIRCLED DIGIT ZERO | ①②③...⓽⓾⓿
|
U+2776 - U+2793 | DINGBAT NEGATIVE CIRCLED DIGIT ONE - DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN | ❶❷❸...➑➒➓
|
U+2C00 - U+2DFF | GLAGOLITIC CAPITAL LETTER AZU - COMBINING CYRILLIC LETTER IOTIFIED BIG YUS | ⰀⰁⰂ...
|
U+2E80 - U+2FFF | CJK RADICAL REPEAT - IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID | ⺀⺁⺂...⿹⿺⿻
|
U+3004 - U+3007 | JAPANESE INDUSTRIAL STANDARD SYMBOL - IDEOGRAPHIC NUMBER ZERO | 〄々〆〇
|
U+3021 - U+302F | HANGZHOU NUMERAL ONE - HANGUL DOUBLE DOT TONE MARK | 〡〢〣...
|
U+3031 - U+D7FF | VERTICAL KANA REPEAT MARK - HANGUL JONGSEONG PHIEUPH-THIEUTH | ...
|
U+F900 - U+FD3D | CJK COMPATIBILITY IDEOGRAPH-F900 - ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM | 豈更車...ﴻﴼﴽ
|
U+FD40 - U+FDCF | ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM - ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM |
|
U+FDF0 - U+FE44 | ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM - PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET |
...﹂﹃﹄
|
U+FE47 - U+FFFD | PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET - REPLACEMENT CHARACTER | ﹇﹈﹉...�
|
U+10000 - U+1FFFD | LINEAR B SYLLABLE B008 A - CHEESE WEDGE (U+1F9C0) | |
U+20000 - U+2FFFD | <CJK Ideograph Extension B, First> - CJK COMPATIBILITY IDEOGRAPH-2FA1D (U+2FA1D) | |
U+30000 - U+3FFFD | ||
U+40000 - U+4FFFD | ||
U+50000 - U+5FFFD | ||
U+60000 - U+6FFFD | ||
U+70000 - U+7FFFD | ||
U+80000 - U+8FFFD | ||
U+90000 - U+9FFFD | ||
U+A0000 - U+AFFFD | ||
U+B0000 - U+BFFFD | ||
U+C0000 - U+CFFFD | ||
U+D0000 - U+DFFFD | ||
U+E0000 - U+EFFFD | LANGUAGE TAG (U+E0001) - VARIATION SELECTOR-256 (U+E01EF) |
以下の Unicode 文字範囲は識別子の先頭には使用できません。
コードポイント | 説明 | 文字 |
---|---|---|
U+0300 - U+036F | COMBINING GRAVE ACCENT - COMBINING LATIN SMALL LETTER X | |
U+1DC0 - U+1DFF | COMBINING DOTTED GRAVE ACCENT - COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW | |
U+20D0 - U+20FF | COMBINING LEFT HARPOON ABOVE - COMBINING ASTERISK ABOVE | |
U+FE20 - U+FE2F | COMBINING LIGATURE LEFT HALF - COMBINING CYRILLIC TITLO RIGHT HALF |
[編集] 関連項目
識別子 の C言語リファレンス
|