code

C ++ 구문 "A :: B : A {};"는 무엇입니까?

codestyles 2020. 11. 20. 08:59
반응형

C ++ 구문 "A :: B : A {};"는 무엇입니까? 평균


C ++ 구문 struct A::B:A {};은 무엇을 의미합니까? C ++ 표준에서이 이름 정의 (또는 액세스)는 어디에 설명되어 있습니까?

#include <iostream>

struct B;

struct A {
    struct B;
};

struct A::B:A {
};

int main() {
    A::B::A::B b;
    std::cout<<"Sizeof A::B::A::B is " << sizeof(A::B::A::B)<<std::endl;
    return 0;
}

이 정의

struct A {
    struct B;
};

A중첩 된 struct B1 선언으로 struct 정의합니다 . 의 완전한 이름 B입니다 A::B당신은 말할 수, B의 "네임 스페이스"내부입니다 A. 다음은 :

struct A::B : A { // Note I added spaces
};

의 정의인가 A::B하고 하나 :가되어 지정 파생 에서 A.

이제 흥미로운 부분은 A::B::A::B. 해부 해 보겠습니다.

  1. A::B 중첩 된 구조의 이름을 지정합니다.
  2. A::B::AA내부에 삽입 된 클래스 이름에 액세스합니다 B. 주입은 상속 때문입니다.
  3. A::B::A::B중첩 된 구조의 이름 BA다시 지정합니다.

그리고 ad-infinitum을 계속하거나 적어도 컴파일러가 번역 제한 2를 충족 할 때까지 계속할 수 있습니다 .

재미있는 지적 연습이지만 실제 코드의 전염병처럼 피하십시오.


[class.qual] / 1 은 조회 작동 방식을 설명합니다.

는 IF 중첩 된 이름 지정 (A)의 자격을 갖춘-ID가 클래스를 지명은 후 지정된 이름 중첩 된 이름 지정은 나와있는 경우를 제외하고, 클래스 ([class.member.lookup])의 범위에 조회됩니다 이하. 이름은 해당 클래스 또는 기본 클래스 중 하나의 멤버를 하나 이상 나타냅니다 (Clause [class.derived]).

위의 텍스트는 [class] / 2 때문에 기본 클래스의 이름을 지정할 수 있습니다.

클래스 이름은 또한 클래스 자체의 범위 내로 삽입된다; 이것은 injected-class-name 으로 알려져 있습니다. 액세스 검사를 위해 삽입 된 클래스 이름 은 공용 멤버 이름 인 것처럼 처리됩니다.

위의 내용은 정규화 된 이름을 시작 A::하면 멤버 또는 기본 클래스를 지정할 수 있음을 분명히 말합니다 . 이후 A에는 기지가 없습니다 만 지정할 수 있습니다 A::B(에 "회원 유형을"). 그러나 A::B또한 클래스를 지명합니다. 우리의 기본 또는 멤버 지정할 수 있도록 뿐만 아니라와 A::B::우리가 이름을 지정할 수 있습니다, A::B::A. 이제 헹구고 반복하십시오.


1- 완전히 다른 것 B입니다. 전역과 전혀 관련이 없습니다 struct B.
2- [implimits] /2.36 에 따라 권장되는 최소 256


우선 글로벌 네임 스페이스에서 struct B;struct의 포워드 선언입니다 B. 이 예제에서는 실제로 관련이 없기 때문에 혼란 스러울 수 있습니다. 이 전역 B::B또는로 액세스 할 수 있습니다 B.

struct A {
    struct B;
};

중첩 된 구조체 A의 포워드 선언이있는 전역 네임 스페이스 의 구조체 정의입니다 (이전 에 전역 네임 스페이스에서 선언 것과 동일하지 않음 ). 이 중첩 또는 로 액세스 할 수 있습니다 .BBB::A::BA::B

struct A::B:A {
};

Is a definition of nested struct B of struct A that inherits from A (with access specifier omitted). It can be rewritten to:

struct A::B
:   public A
{
};

Note that writing definition of nested struct B inside of A definition like this won't work:

struct A {
    struct B: A { // error: A is incomplete at this point
    };
};

And finally A::B::A is referring to the base class of nested struct B, that is to A, so A::B::A::B is equivalent to just A::B.

참고URL : https://stackoverflow.com/questions/47546616/what-does-c-syntax-aba-mean

반응형