Identifiers
識別子は、数字、アンダースコア、ラテン文字の小文字と大文字、およびほとんどのUnicode文字で構成される任意の長さの文字列です。
有効な識別子の最初の文字は、以下のいずれかでなければなりません:
- 大文字のラテン文字 A-Z
- 小文字のラテン文字 a-z
- アンダースコア
- Unicodeプロパティ XID_Start を持つ任意のUnicode文字
有効な識別子のその他の文字は、以下のいずれかでなければなりません:
- 数字 0-9
- 大文字ラテン文字 A-Z
- 小文字ラテン文字 a-z
- アンダースコア
- Unicodeプロパティ XID_Continue を持つ任意のUnicode文字
XID_StartおよびXID_Continueプロパティを持つ文字のリストは、 DerivedCoreProperties.txt で確認できます。
識別子は大文字と小文字を区別し(小文字と大文字は異なるものとして扱われます)、すべての文字が意味を持ちます。すべての識別子は Normalization Form C に準拠しなければなりません。
注: Unicode識別子のサポートはほとんどの実装で制限されています。例: gcc (10まで) .
目次 |
宣言内で
識別子は以下のものを 命名するために使用できます :オブジェクト、参照、関数、列挙子、型、クラスメンバ、名前空間、テンプレート、テンプレート特殊化、 パラメータパック (C++11以降) 、gotoラベル、その他のエンティティ。ただし以下の例外があります:
- 識別子のうち keywords は他の目的で使用できません。
|
(C++11以降) |
- 特定の演算子および句読点の 代替表現 である識別子は、他の目的には使用できません。
|
(C++11以降) |
-
識別子
トークンまたは前処理トークンとして現れる(つまり
user-defined-string-literal
内ではない、例えば
operator
""
id
のような)
(C++11以降)
以下の形式のいずれかを取るものは予約されています:
- グローバル名前空間では、アンダースコアで始まる識別子
- 二重アンダースコアを含む、またはアンダースコアに続いて大文字で始まる識別子(以下の識別子を除く):
-
-
- 定義済みマクロ ( 言語機能テストマクロ を含む) (C++20以降)
-
| (C++11以降) |
|
(C++11以降) |
| (C++20以降) |
「予約済み」とは、標準ライブラリヘッダーが #define またはそのような識別子を内部的な必要性のために宣言することを意味し、コンパイラは非標準のその種の識別子を事前定義する可能性があり、名前マングリングアルゴリズムはこれらの識別子の一部が使用されていないと仮定する可能性があります。プログラマがそのような識別子を使用する場合、プログラムは不適格であり、診断は不要です。
さらに、翻訳単位内で特定の名前を #define または #undef することは未定義動作となります。詳細は 予約済みマクロ名 を参照してください。
ゾンビ識別子
C++14以降、一部の識別子がC++標準ライブラリから削除されました。これらは zombie namesのリスト に記載されています。
しかし、これらの識別子は特定の文脈において以前の標準化のために予約されています。削除されたメンバ関数名は関数形式マクロの名前として使用できず、その他の削除されたメンバ名は移植性のあるコードではオブジェクト形式マクロの名前として使用できません。
式の中での使用
変数、関数、 concept の特殊化、 (C++20以降) または列挙子を名前付ける識別子は expression として使用できます。識別子のみから構成される式の結果は、その識別子によって名前付けられた実体です。式の value category は、識別子が関数、変数 、 template parameter object (C++20以降) またはデータメンバを名前付ける場合は lvalue であり、それ以外の場合(例えば enumerator は rvalue (C++11以前) prvalue (C++11以降) 式 、conceptの特殊化はbool prvalue (C++20以降) )です。
型
識別子式の型は、それが指すエンティティの型と同じです。
|
以下の例外が存在します:
void f() { float x, &r = x; [=] { decltype(x) y1; // y1 has type float decltype((x)) y2 = y1; // y2 has type float const& because this lambda // is not mutable and x is an lvalue decltype(r) r1 = y1; // r1 has type float& decltype((r)) r2 = y2; // r2 has type float const& }; }
|
(C++11以降) |
非修飾識別子
適切に宣言された識別子に加えて、以下の要素も同じ役割で式内で使用できます:
- オーバーロードされた演算子 の関数表記名、例えば operator + または operator new など;
- ユーザー定義変換関数 の名前、例えば operator bool など;
|
(C++11以降) |
- テンプレート 名とその引数リスト、例えば MyTemplate < int > など;
- 文字 ~ に続くクラス名、例えば ~MyClass など;
|
(C++11以降) |
|
(C++26以降) |
識別子と共に、これらは unqualified identifier expressions として知られています。
修飾付き識別子
修飾識別子式 とは、スコープ解決演算子 :: が前置された非修飾識別子式であり、オプションとして、スコープ解決演算子で区切られた以下のいずれかのシーケンスが続く場合があります:
- 名前空間名;
- クラス名;
|
(C++11以降) |
|
(C++26 以降) |
例えば、式 std:: string :: npos は、名前空間 std 内のクラス string における静的メンバ npos を指す式です。式 :: tolower はグローバル名前空間の関数 tolower を指します。式 :: std:: cout は最上位名前空間である std 内のグローバル変数 cout を指します。式 boost :: signals2 :: connection は、名前空間 boost 内で宣言された名前空間 signals2 で宣言された型 connection を指します。
キーワード template は、修飾された識別子内で、 依存テンプレート名 の曖昧性を解消するために必要に応じて現れることがあります。
詳細については、修飾名の名前探索については qualified lookup を参照してください。
暗黙的メンバーアクセス変換
識別子式
E
が何らかのクラス
C
の非静的データメンバを表し、かつ以下の条件が全て満たされる場合、
E
はクラスメンバアクセス式
this
-
>
E
に変換されます:
- E が メンバアクセス演算子 の右オペランドではない場合。
- E が修飾識別子式である場合、 E が アドレス取得演算子 の括弧で囲まれていないオペランドではない場合。
- 以下のいずれかの条件が満たされる場合:
-
- E は 潜在的に評価される 。
-
Cは E における最も内側の外側クラスである。 -
Cは E における最も内側の外側クラスの基底クラスである。
この変換はテンプレート定義の文脈では適用されません( dependent names を参照)。
struct X { int x; }; struct B { int b; }; struct D : B { X d; void func() { d; // OK、this->dに変換される b; // OK、this->bに変換される x; // エラー:this->xは不正な形式 d.x; // OK、this->d.xに変換される // d.this->xやthis->d.this->xではない } };
名前
名前は、以下のいずれかを使用してエンティティを参照することです:
- 識別子
- 関数記法におけるオーバーロードされた演算子名 ( operator + , operator new )
- ユーザー定義変換関数名 ( operator bool )
|
(C++11以降) |
- テンプレート名とそれに続く引数リスト ( MyTemplate < int > )
すべての名前はプログラム内で 宣言 によって導入されます。複数の翻訳単位で使用される名前は、 リンケージ に応じて、同じエンティティまたは異なるエンティティを参照する場合があります。
コンパイラがプログラム内で未知の名前を検出した場合、テンプレート宣言および定義内の dependent names を除き(これらの名前については、コンパイラが型、テンプレート、その他のエンティティのいずれを指すかを判定する必要があり、 explicit disambiguation が必要となる場合があります)、 name lookup によってその名前を導入した宣言に関連付けます。
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| CWG 1440 | C++11 |
::
に先行する decltype 式は
任意の型を表すことができた |
クラス型または列挙型のみを
表すことができる |
| CWG 1963 | C++11 |
数字、非数字、ユニバーサル文字名以外の
実装定義文字を識別子で使用できた |
禁止された |
| CWG 2521 | C++11 |
リテラル演算子の
user-defined-string-literal
内の識別子は通常通り予約されていた |
ルールが異なる |
| CWG 2771 | C++98 |
クラスコンテキストで
&
a
が
&
this
-
>
a
に
変換されなかった |
変換される |
| CWG 2777 | C++20 |
テンプレート引数オブジェクトを名前とする
識別子式の型が不明確だった |
明確化された |
| CWG 2818 | C++98 | 定義済みマクロ名は予約されていた | 予約されていない |
関連項目
|
C ドキュメント
for
Identifiers
|