최근에 이상한 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; };