名前空間
変種
操作

識別子

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (C++20未満)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 

識別子は、数字、アンダースコア、ラテン文字の小文字と大文字、およびほとんどの Unicode 文字 (詳細は下を参照してください) の任意長の並びです。 有効な識別子は数字以外の文字 (ラテン文字、アンダースコア、または Unicode の数字以外の文字) で始まらなければなりません。 識別子は大文字と小文字が区別され、すべての文字が有意です。

ノート: C++ の文法は、形式的には Unicode 文字が \u または \U でエスケープされることを要求していますが、翻訳フェーズ1のため、それはソースコードから生の Unicode 文字がどのようにコンパイラに渡されるかという問題そのものです。 この機能のサポートは制限されるかもしれないことにも注意してください (例: gcc)。

目次

[編集] 宣言内で

識別子はオブジェクト、参照、関数、列挙、型、クラスメンバ、名前空間、テンプレート、テンプレートの特殊化、パラメータパック、 goto のラベル、およびその他のエンティティに名前を付けるために使用できます。 ただし以下の例外があります。

  • キーワードである識別子は、それ以外の目的に使用することはできません。
  • いずれかの場所に二重のアンダースコアを持つ識別子は予約されています。
  • アンダースコアで始まりその直後に大文字が続く識別子は予約されています。
  • アンダースコアで始まる識別子はグローバル名前空間では予約されています。

ここでいう「予約されています」は、標準ライブラリヘッダが内部使用のためにそのような識別子を #define または宣言するかもしれない、コンパイラがそのような種類の非標準の識別子を事前定義するかもしれない、および名前マングリングアルゴリズムがそのような識別子が使用されていないことを仮定しているかもしれない、という意味です。 プログラマがそのような識別子を使用した場合、動作は未定義です。

また、キーワードと同一の名前を #define または #undef することは未定義動作です。 標準ライブラリヘッダを少なくともひとつインクルードする場合、いかなる標準ライブラリヘッダで宣言されている名前とも同一の識別子を #define または #undef することは未定義動作です。

[編集] 式内で

変数、関数コンセプトの特殊化 (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 に暗黙に変換されます。

[編集] 非修飾識別子

適切に宣言された識別子の他に、以下のものが式内で同じ役割で使用できます。

識別子と合わせて、これらは非修飾識別子式と言います。

[編集] 修飾識別子

修飾識別子式は、スコープ解決演算子 :: および、オプショナルな列挙、 (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

[編集] 関連項目