Namespaces
Variants

Identifiers

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

識別子は、数字、アンダースコア、ラテン文字の小文字と大文字、およびほとんどの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 は他の目的で使用できません。
  • これらが非キーワードとして使用できる唯一の場所は attribute-token 内である(例: [ [ private ] ] は有効な 属性 である)。
(C++11以降)
  • 特定の演算子および句読点の 代替表現 である識別子は、他の目的には使用できません。
  • 特別な意味を持つ識別子( final import module (C++20以降) および override )は、通常の識別子ではなく、特定の文脈で明示的に使用されます。
    • 特に指定がない限り、特定の識別子が特別な意味を持つかどうかの曖昧さは、そのトークンを通常の識別子として解釈するように解決されます。
(C++11以降)
  • 識別子 トークンまたは前処理トークンとして現れる(つまり user-defined-string-literal 内ではない、例えば operator "" id のような) (C++11以降) 以下の形式のいずれかを取るものは予約されています:
    • グローバル名前空間では、アンダースコアで始まる識別子
    • 二重アンダースコアを含む、またはアンダースコアに続いて大文字で始まる識別子(以下の識別子を除く):
(C++11以降)
  • 標準ライブラリで定義されている以下のマクロ:
  • C互換性マクロ __alignas_is_defined および __alignof_is_defined <stdalign.h> で定義)
  • C互換性マクロ __bool_true_false_are_defined <stdbool.h> で定義)
(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++20以降)
(C++11以降)

非修飾識別子

適切に宣言された識別子に加えて、以下の要素も同じ役割で式内で使用できます:

(C++11以降)
  • テンプレート 名とその引数リスト、例えば MyTemplate < int > など;
  • 文字 ~ に続くクラス名、例えば ~MyClass など;
  • 文字 ~ に続く decltype 指定子、例えば ~decltype ( str ) など。
(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 潜在的に評価される
  • 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 )
  • ユーザー定義リテラル演算子名 ( operator "" _km )
(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