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

식별자 는 숫자, 밑줄, 라틴 문자 소문자 및 대문자, 그리고 대부분의 유니코드 문자로 구성된 임의의 길이를 가진 문자열입니다.

유효한 식별자의 첫 번째 문자는 다음 중 하나여야 합니다:

  • 대문자 라틴 문자 A-Z
  • 소문자 라틴 문자 a-z
  • 밑줄
  • 유니코드 속성 XID_Start 를 가진 모든 유니코드 문자

유효한 식별자의 다른 모든 문자는 다음 중 하나여야 합니다:

  • 숫자 0-9
  • 대문자 라틴 문자 A-Z
  • 소문자 라틴 문자 a-z
  • 밑줄
  • Unicode 속성 XID_Continue 를 가진 모든 Unicode 문자

XID_Start 및 XID_Continue 속성을 가진 문자 목록은 DerivedCoreProperties.txt 에서 확인할 수 있습니다.

식별자는 대소문자를 구분하며(소문자와 대문자는 서로 다름), 모든 문자가 의미를 가집니다. 모든 식별자는 Normalization Form C 를 준수해야 합니다.

참고: 대부분의 구현체에서 유니코드 식별자 지원은 제한적입니다. 예를 들어 gcc (10 버전까지) .

목차

선언에서

식별자는 다음 예외를 제외하고 객체, 참조, 함수, 열거자, 타입, 클래스 멤버, 네임스페이스, 템플릿, 템플릿 특수화, 매개변수 팩 (C++11부터) , goto 레이블 및 다른 엔티티들을 명명하는 데 사용될 수 있습니다 :

  • 식별자 중 키워드 는 다른 용도로 사용할 수 없습니다.
  • 이들이 비키워드로 사용될 수 있는 유일한 곳은 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부터)

"Reserved"는 여기서 표준 라이브러리 헤더들이 #define 하거나 내부 필요에 따라 이러한 식별자를 선언한다는 의미이며, 컴파일러가 비표준 식별자를 미리 정의할 수 있고, 이름 맹글링 알고리즘이 이러한 식별자 중 일부가 사용되지 않는다고 가정할 수 있습니다. 프로그래머가 이러한 식별자를 사용할 경우, 프로그램은 형식 오류이며 진단이 필요하지 않습니다.

또한, 특정 이름들을 번역 단위에서 #define 또는 #undef 하는 것은 정의되지 않은 동작입니다. 자세한 내용은 예약된 매크로 이름 을 참조하십시오.

좀비 식별자

C++14부터 일부 식별자들이 C++ 표준 라이브러리에서 제거되었습니다. 이들은 좀비 이름 목록 에 나열되어 있습니다.

그러나 이러한 식별자는 특정 맥락에서 이전 표준화를 위해 여전히 예약되어 있습니다. 제거된 멤버 함수 이름은 함수형 매크로의 이름으로 사용할 수 없으며, 다른 제거된 멤버 이름은 이식 가능한 코드에서 객체형 매크로의 이름으로 사용할 수 없습니다.

표현식에서

변수, 함수, concept 의 특수화, (since C++20) 또는 열거자를 명명하는 식별자는 expression 으로 사용될 수 있습니다. 단순히 식별자로 구성된 표현식의 결과는 해당 식별자가 명명하는 엔티티입니다. 표현식의 value category 는 식별자가 함수, 변수 , template parameter object , (since C++20) 또는 데이터 멤버를 명명할 경우 lvalue 이며, rvalue (until C++11) prvalue (since C++11) 입니다 (예: enumerator rvalue (until C++11) prvalue (since C++11) 표현식 , concept의 특수화는 bool prvalue (since C++20) ).

타입

식별자 표현식의 타입은 그것이 지칭하는 엔티티의 타입과 동일합니다.

다음 예외 사항이 존재합니다:

  • (한정자 없는) 식별자로 명명된 엔티티가 지역 엔티티이고, 해당 식별자가 나타나는 선언 영역에서 평가되지 않은 피연산자 외부에서 이름이 사용될 경우 복사본으로 캡처하는 lambda expression 가 중간에 존재하게 된다면, 이 표현식의 타입은 가장 내부에 있는 그러한 중간 lambda expression의 closure object에서 이러한 캡처를 위해 선언될 비정적 데이터 멤버를 명명하는 class member access 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&
    };
}
  • 명명된 엔티티가 T 타입의 템플릿 매개변수에 대한 template parameter object 인 경우, 표현식의 타입은 const T 입니다.
(since C++20)
(since C++11)

비한정 식별자

적절히 선언된 식별자 외에, 다음 요소들도 동일한 역할로 표현식에서 사용될 수 있습니다:

  • 사용자 정의 리터럴 연산자 이름, 예를 들어 operator "" _km ;
(C++11부터)
  • 템플릿 이름과 그 뒤에 오는 인수 목록, 예를 들어 MyTemplate < int > ;
  • 문자 ~ 뒤에 클래스 이름이 오는 경우, 예를 들어 ~MyClass ;
  • 문자 ~ 다음에 decltype 지정자가 오는 경우, 예를 들어 ~decltype ( str ) 와 같습니다.
(C++11부터)
(C++26부터)

식별자와 함께 이들은 unqualified identifier expressions 로 알려져 있습니다.

한정된 식별자

정규화된 식별자 표현 은 범위 지정 연산자 :: 로 시작하는 비정규화된 식별자 표현이며, 선택적으로 다음 중 하나 이상의 시퀀스가 범위 지정 연산자로 구분되어 앞에 올 수 있습니다:

  • 네임스페이스 이름;
  • 클래스 이름;
(C++11부터)
(C++26부터)

예를 들어, 표현식 std:: string :: npos npos 정적 멤버를 나타내는 표현식으로, string 클래스 내에 선언되어 있으며 std 네임스페이스에 속합니다. 표현식 :: tolower 는 전역 네임스페이스에 있는 tolower 함수를 나타냅니다. 표현식 :: std:: cout 는 최상위 네임스페이스인 std 네임스페이스에 선언된 전역 변수 cout 을 나타냅니다. 표현식 boost :: signals2 :: connection boost 네임스페이스 내에 선언된 signals2 네임스페이스에서 정의된 connection 타입을 나타냅니다.

키워드 template dependent template names 의 모호성을 해소하기 위해 필요할 경우 한정된 식별자 내에 나타날 수 있습니다.

자세한 내용은 한정된 식별자에 대한 이름 검색은 qualified lookup 를 참조하십시오.

암시적 멤버 접근 변환

식별자 표현식 E 가 어떤 클래스 C 의 비정적 비타입 멤버를 나타내고 다음 조건들이 모두 충족되면, E 는 클래스 멤버 접근 표현식 this - > E 으로 변환됩니다:

  • E 멤버 접근 연산자 의 우측 피연산자가 아닙니다.
  • 만약 E 가 한정된 식별자 표현식인 경우, 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가 아님
    }
};

이름

name 은 다음 중 하나를 사용하여 개체를 참조하는 것을 의미합니다:

  • 식별자
  • 함수 표기법의 오버로드된 연산자 이름 ( operator + , operator new )
  • 사용자 정의 변환 함수 이름 ( operator bool )
  • 사용자 정의 리터럴 연산자 이름 ( operator "" _km )
(C++11부터)
  • 템플릿 이름과 그 뒤에 오는 인수 목록 ( MyTemplate < int > )

모든 이름은 프로그램 내에서 선언 을 통해 도입됩니다. 둘 이상의 번역 단위에서 사용되는 이름은 링크 에 따라 동일한 개체나 서로 다른 개체를 참조할 수 있습니다.

컴파일러가 프로그램에서 알 수 없는 이름을 만나면, 그것을 해당 이름을 도입한 선언과 이름 검색 을 통해 연결합니다. 단, 템플릿 선언과 정의 내의 종속 이름 은 예외입니다 (이러한 이름들의 경우, 컴파일러는 그것이 타입, 템플릿, 또는 다른 개체를 지칭하는지 판단하며, 이때 명시적 구분 이 필요할 수 있습니다).

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 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