왜 주입 된 클래스 이름이 있습니까?
최근에 이상한 C ++ 기능 인 injection class name을 보았습니다 .
class X { };
X x1;
class X::X x2; // class X::X is equal to X
class X::X::X x3; // ...and so on...
그러나이 기능이 왜 필요한지 알 수 없습니다. 이 기능이 필요한 연습이 있습니까?
그리고이 기능은 이전 C ++에는 존재하지 않는다고 들었습니다. 그렇다면 언제 소개 되었습니까? C ++ 03? C ++ 11?
삽입 된 클래스 이름은 X
의 멤버로 선언 된 것을 의미 X
하므로 내부의 이름 조회 X
는 항상 X
같은 묶음 범위에서 선언 될 수있는 다른 클래스가 아니라 현재 클래스를 찾습니다.
void X() { }
class X {
public:
static X create() { return X(); }
};
은 IS create()
기능은 임시 만드는 X
객체 또는 함수를 호출 X
? 네임 스페이스 범위에서 함수를 호출하므로 주입 된 클래스 이름의 목적은 이름의 본문 내에서 X
항상 클래스 자체를 찾도록하는 것입니다 (이름 조회는 클래스를 찾기 전에 클래스의 자체 범위에서 시작하기 때문에) 범위).
주입 된 클래스 이름을 템플릿 인수 목록없이 사용할 수있는 클래스 템플릿 내부에서도 유용합니다 (예 : Foo
full template-id 대신 간단히 사용) Foo<blah, blah, blah>
. 따라서 현재 인스턴스화를 쉽게 참조 할 수 있습니다. 이를 명확히하는 C ++ 98과 C ++ 03 사이의 변경 사항 은 DR 176 을 참조하십시오 .
삽입 된 클래스 이름에 대한 아이디어는 C ++ 98에 존재했지만이 용어는 C ++ 03에 새로 도입되었습니다.
C ++ 98의 말 :
클래스 이름은 후 즉시 선언 된 범위에 삽입 클래스 이름을 볼 수 있습니다. class-name은 클래스 자체의 범위에도 삽입됩니다.
두 번째 문장은 DR 147에 의해 변경 되었으므로 C ++ 03은 [class] / 2에서 다음과 같이 말합니다.
클래스 이름은 후 즉시 선언 된 범위에 삽입 클래스 이름을 볼 수 있습니다. 클래스 이름은 또한 클래스 자체의 범위 내로 삽입된다; 이것을 injection-class-name이라고 합니다.
C ++ 98 이전에도 ARM은 거의 동등한 단어를 사용하므로 클래스 이름을 클래스 본문에서 항상 클래스 자체를 참조하는 데 사용할 수 있습니다.
클래스 이름 은 클래스 지정자 자체 의 멤버 목록 내에서도 클래스 이름 으로 사용할 수 있습니다 .
- 예를 들어
class link { link* next; };
참고 URL : https://stackoverflow.com/questions/25549652/why-is-there-an-injected-class-name
'Programming' 카테고리의 다른 글
앱이 사용할 수있는 최대 RAM 양은 얼마입니까? (0) | 2020.06.23 |
---|---|
데이터베이스 클러스터 및로드 밸런싱 (0) | 2020.06.23 |
NerdDinner의 ASP.NET MVC에서 ModelState.IsValid가 유효한 것은 무엇입니까? (0) | 2020.06.23 |
코 루틴 대 연속 대 발전기 (0) | 2020.06.23 |
스핑크스 오토 독은 충분히 자동적이지 않다 (0) | 2020.06.23 |