Identifiers
식별자 는 숫자, 밑줄, 라틴 문자 소문자 및 대문자, 그리고 대부분의 유니코드 문자로 구성된 임의의 길이를 가진 문자열입니다.
유효한 식별자의 첫 번째 문자는 다음 중 하나여야 합니다:
- 대문자 라틴 문자 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 레이블 및 다른 엔티티들을 명명하는 데 사용될 수 있습니다 :
- 식별자 중 키워드 는 다른 용도로 사용할 수 없습니다.
|
(C++11부터) |
- 특정 연산자와 구두점에 대한 대체 표현 으로 사용되는 식별자는 다른 용도로 사용할 수 없습니다.
|
(C++11부터) |
-
식별자
토큰 또는 전처리 토큰으로 나타나는 (즉,
user-defined-string-literal
내부가 아닌, 예를 들어
operator
""
id
같은 경우 제외)
(C++11부터)
중 다음 형태 중 하나를 가지는 식별자는 예약되어 있습니다:
- 전역 네임스페이스에서 밑줄로 시작하는 식별자
- 이중 밑줄을 포함하거나 밑줄 뒤에 대문자가 오는 식별자 (다음 식별자들은 제외):
-
-
- 미리 정의된 매크로 ( 언어 기능 테스트 매크로 포함) (C++20부터)
-
| (C++11 이후) |
|
(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) ).
타입
식별자 표현식의 타입은 그것이 지칭하는 엔티티의 타입과 동일합니다.
|
다음 예외 사항이 존재합니다:
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++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 는 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 는 주소 연산자 의 괄호로 묶이지 않은 피연산자가 아닙니다.
- 다음 조건 중 하나가 충족됩니다:
-
- E 가 잠재적으로 평가되는(potentially evaluated) 경우.
-
C가 E 에서 가장 안쪽에 있는 enclosing 클래스인 경우. -
C가 E 에서 가장 안쪽에 있는 enclosing 클래스의 기본 클래스(base class)인 경우.
이 변환은 템플릿 정의 컨텍스트에서는 적용되지 않습니다( 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 )
|
(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
|