Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      Identifiers

      From cppreference.com
      <cpp‎ |language
       
       
      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
       
       

      Anidentifier is an arbitrarily long sequence of digits, underscores, lowercase and uppercase Latin letters, and most Unicode characters.

      The first character of a valid identifier must be one of the following:

      • uppercase Latin letters A-Z
      • lowercase Latin letters a-z
      • underscore
      • any Unicode character with the Unicode propertyXID_Start

      Any other character of a valid identifier must be one of the following:

      • digits 0-9
      • uppercase Latin letters A-Z
      • lowercase Latin letters a-z
      • underscore
      • any Unicode character with the Unicode propertyXID_Continue

      The lists of characters with properties XID_Start and XID_Continue can be found inDerivedCoreProperties.txt.

      Identifiers are case-sensitive (lowercase and uppercase letters are distinct), and every character is significant. Every identifier must conform toNormalization Form C.

      Note: Support of Unicode identifiers is limited in most implementations, e.g.gcc (until 10).

      Contents

      [edit]In declarations

      An identifier can be usedto name objects, references, functions, enumerators, types, class members, namespaces, templates, template specializations, parameter packs(since C++11), goto labels, and other entities, with the following exceptions:

      • The identifiers that arekeywords cannot be used for other purposes.
      • The only place they can be used as non-keywords is in anattribute-token (e.g.[[private]] is a validattribute).
      (since C++11)
      • The identifiers with special meaning (final,import,module(since C++20) andoverride) are used explicitly in a certain context rather than being regular identifiers.
        • Unless otherwise specified, any ambiguity as to whether a given identifier has a special meaning is resolved to interpret the token as a regular identifier.
      (since C++11)
      • Identifiersthat appear as a token or preprocessing token (i.e., not inuser-defined-string-literal likeoperator""id)(since C++11) of one of the following forms are reserved:
        • in the global namespace, identifiers that begin with an underscore
        • identifiers that contain a double underscore or begin with an underscore followed by an uppercase letter, except the following identifiers:
      (since C++11)
      • the following macros defined in the standard library:
      • the C compatibility macros__alignas_is_defined and__alignof_is_defined (defined in<stdalign.h>)
      • the C compatibility macro__bool_true_false_are_defined (defined in<stdbool.h>)
      (since C++11)
      (since C++20)

      “Reserved” here means that the standard library headers#define or declare such identifiers for their internal needs, the compiler may predefine non-standard identifiers of that kind, and that name mangling algorithm may assume that some of these identifiers are not in use. If the programmer uses such identifiers, the program is ill-formed, no diagnostic required.

      In addition, it is undefined behavior to#define or#undef certain names in a translation unit, seereserved macro names for more details.

      [edit]Zombie identifiers

      As of C++14, some identifiers are removed from the C++ standard library. They are listed in thelist of zombie names.

      However, these identifiers are still reserved for previous standardization in a certain context. Removed member function names may not be used as a name for function-like macros, and other removed member names may not be used as a name for object-like macros in portable code.

      [edit]In expressions

      An identifier that names a variable, a function,specialization of aconcept,(since C++20) or an enumerator can be used as anexpression. The result of an expression consisting of just the identifier is the entity named by the identifier. Thevalue category of the expression islvalue if the identifier names a function, a variable, atemplate parameter object(since C++20), or a data member, andrvalue(until C++11)prvalue(since C++11) otherwise (e.g. anenumerator isan rvalue(until C++11)a prvalue(since C++11) expression, a specialization of a concept is a bool prvalue(since C++20)).

      [edit]Type

      The type of an identifier expression is the same as the type of the entity it names.

      The following exceptions exist:

      • If the entity named by the (unqualified) identifier is a local entity, and would result in an interveninglambda expression capturing it by copy if it were named outside of an unevaluated operand in the declarative region in which the identifier appears, then the type of the expression is the type of aclass member access expression naming the non-static data member that would be declared for such a capture in the closure object of the innermost such intervening lambda expression.
      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&};}
      (since C++20)
      (since C++11)

      [edit]Unqualified identifiers

      Besides suitably declared identifiers, the following can be used in expressions in the same role:

      (since C++11)
      • atemplate name followed by its argument list, such asMyTemplate<int>;
      • the character~ followed by a class name, such as~MyClass;
      • the character~ followed by adecltype specifier, such as~decltype(str).
      (since C++11)
      (since C++26)

      Together with identifiers they are known asunqualified identifier expressions.

      [edit]Qualified identifiers

      Aqualified identifier expression is an unqualified identifier expression prepended by a scope resolution operator::, and optionally, a sequence of any of the following separated by scope resolution operators:

      • a namespace name;
      • a class name;
      (since C++11)
      (since C++26)

      For example, the expressionstd::string::npos is an expression that names the static membernpos in the classstring in namespacestd. The expression::tolower names the functiontolower in the global namespace. The expression::std::cout names the global variablecout in namespacestd, which is a top-level namespace. The expressionboost::signals2::connection names the typeconnection declared in namespacesignals2, which is declared in namespaceboost.

      The keywordtemplate may appear in qualified identifiers as necessary to disambiguatedependent template names.

      Seequalified lookup for the details of the name lookup for qualified identifiers.

      [edit]Implicit member access transformation

      If an identifier expressionE denotes a non-static non-type member of some classC and all following conditions are satisfied,E is transformed into the class member access expressionthis->E:

      • E is not the right operand of amember access operator.
      • IfE is a qualified identifier expression,E is not the un-parenthesized operand of anaddress-of operator.
      • Any of the following conditions is satisfied:
      • E ispotentially evaluated.
      • C is the innermost enclosing class atE.
      • C is a base class of the innermost enclosing class atE.

      This transformation does not apply in the template definition context (seedependent names).

      struct X{int x;}; struct B{int b;}; struct D: B{    X d; void func(){        d;// OK, will be transformed into this->d        b;// OK, will be transformed into this->b        x;// Error: this->x is ill-formed         d.x;// OK, will be transformed into this->d.x// instead of d.this->x or this->d.this->x}};

      [edit]Names

      Aname is the use of one of the following to refer to an entity:

      • an identifier
      • an overloaded operator name in function notation (operator+,operator new)
      • a user-defined conversion function name (operatorbool)
      • a user-defined literal operator name (operator""_km)
      (since C++11)
      • a template name followed by its argument list (MyTemplate<int>)

      Every name is introduced into the program by adeclaration. A name used in more than one translation unit may refer to the same or different entities, depending onlinkage.

      When the compiler encounters an unknown name in a program, it associates it with the declaration that introduced the name by means ofname lookup, except for thedependent names in template declarations and definitions (for those names, the compiler determines whether they name a type, a template, or some other entity, which may requireexplicit disambiguation).

      [edit]Defect reports

      The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

      DRApplied toBehavior as publishedCorrect behavior
      CWG 1440C++11decltype expressions preceding:: could denote any typecan only denote class
      or enumeration types
      CWG 1963C++11implementation-defined characters other than digits, non-digits
      and universal character names could be used in an identifier
      prohibited
      CWG 2521C++11the identifier inuser-defined-string-literal of
      a literal operator was reserved as usual
      the rules are different
      CWG 2771C++98&a was not transformed into&this->a in class contextsit is transformed
      CWG 2777C++20the type of an identifier expression was unclear
      if it names a template parameter object
      made clear
      CWG 2818C++98predefined macro names are reservedthey are not reserved

      [edit]See also

      C documentation forIdentifiers
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/language/identifiers&oldid=178677"

      [8]ページ先頭

      ©2009-2025 Movatter.jp