An identifier is an arbitrarily long sequence of letters, digits, and underscores, which begins a non-digit. Identifiers are case-sensitive.
Identifiers can be used to name objects, types, namespaces, and other entities, with the following exceptions:
- The identifiers that are keywords cannot be used for other purposes.
- All identifiers with a double underscore anywhere are reserved
- All identifiers that begin with an underscore followed by an uppercase letter are reserved.
- All identifiers that begin with an underscore are reserved for use at global namespace.
('reserved' means that standard library headers #define or declare such names for their internal needs, and if the programmer uses such names, a name collision may occur)
An identifier that names a variable or a function can be used as an expressions. The expression consisting of just the identifier returns the entity named by the identifier and its value category is lvalue if the identifier names a function, a variable, or a data member, and it is prvalue otherwise (e.g. the identifier nullptr is a prvalue expression)
Within the body of a non-static member function, each identifier that names a non-static member is implicitly transformed to a class member access expression.
Besides simple names of objects and functions, the following language constructs can be used in expressions in the same role (together with identifiers they are known as id-expressions)
- name of an operator function, such as operator + or operator new
- name of a user-defined conversion function, such as operator bool
- name of a user-defined literal operator, such as operator "" _km
- the character ~ followed by class name, such as ~MyClass
- the character ~ followed by decltype specifier, such as ~decltype(str)
- a template identifier, such as MyTemplate<int>
- qualified identifiers, such as std::string or ::tolower
A qualified identifier is an identifier, operator function name, literal operator name, or a template identifier that is prepended by a scope resolution operator ::, and optionally, a sequence of class or namespace names separated by scope resolution operators:
For example, the expression std::string::npos is an id-expression that names the static member npos in the class string in namespace std. The expression ::tolower names the function tolower in the global namespace. The expression ::std::cout names the global variable cout in namespace std, which is a top-level namespace. The qualified identifier boost::signals2::connection names the type connection declared in namespace signals2, which is declared in namespace boost.
|This section is incomplete|
Reason: link to unqualified lookup page, which needs to be written too