다음 코드사용하여 선언의 이상한 행동은
struct A { using type = int; };
struct B : private A {};
struct C : B { using base_type = A; };
GCC 6.1의 모든, 3.8 연타를 참조하십시오, 그리고 A
가 C
내부 보조의 이름부터 아니므로 MSVC 2015 업데이트 3이 컴파일 거부 A
은 (는) B
의 비공개 기초입니다. gcc가 을 using base_type = A
에 넣으면 A
의 기본 생성자를 참조합니다. msvc와 clang은 그렇지 않습니다.
using base_type = ::A
에
using base_type = A
모든 컴파일러가 잘 작동하게 수정 때문에). I가 알 수있는 바와 같이,
A::type
좋아하지
보다 구체적
- 가
A
단지 클래스 이름이다 (비록 함수 이름 GCC 오인하여)C
하지 내부A
도B
에 도입된다. 이 이름이B
에 비공개로 간주되는 이유는 무엇입니까? - 이 컴파일 오류는 버그로 간주 되나요? 아니면 표준 사양에서 뚜렷하지 않습니까?
나는 이것이'C '내부의'A'에 대한 이름 검색이 어떻게 작동하는지에 달려 있다고 생각합니다.먼저'using '전에'C'의 범위에서'A'라는 이름으로 선언 된 것이 있는지 검사합니다. 하나도 찾지 못하기 때문에 Base 클래스이므로'B'의 범위에서 검사합니다. 그리고'B' 범위에서'A'를 찾지 못하면'global namespace'에서 조망 할 것입니다. 그러나 어떻게 든'B'에 의한'A'의 '사적 상속'은 두 번째 룩업, 즉'B'의 범위 내에서 멈추고 있습니다. 'fully qualified'라는 이름으로 작동하기 때문에 실제 문제는 같은 줄에 있어야한다고 생각합니다. – Arunmu
http://eel.is/c++draft/class.access.spec#5가 적합합니다. –
@PiotrSkotnicki 감사합니다. 직접 질문에 답변합니다. 그러나이 규칙의 배후에 합리적인 것을 줄 수 있습니까? –