18

:선언을 사용할 때 템플릿 대체 이후에 종속적 이름이 생성자에 렌더링됩니까? 이 예에서

template<class T> 
struct S : T 
{ 
    using T::X; 
}; 

T::X는 부재 TX 지칭 종속 이름이다. S<T> 만약 는 T = X 인스턴스화됩니다 :

struct X 
{ 
    X(int) {} 
}; 
... 
S<X> s(42); 

는 사용하여 선언은 상속 - 생성자가 될 것인가?

Clang은 코드 DEMO을 거부하고 g ++은이를 허용합니다.

using T::X::X; 

두 컴파일러가 코드를 허용하고 상속 - 생성자로 취급 : 우리가 쓰면 것을

참고. using T::X은 표준으로 상속 생성자가 될 수 있습니까?

답변

4

T.C에 감사드립니다. 이를 지적하기 위해 도면 단계에있는 (문제가있는 것으로 확인되었고 해결책의 표현이 작업 중임)이 사례를 다루는

Core issue 2070 이 코드가 상속되는 생성자로 받아 들여지기 위해서는 제안 된 수정으로 인해 두 ID가 동일한 ID가되어야합니다.

T : X가 X 유형이므로 "typename 태그없이 템플릿에서 유형"오류가 발생하므로 clang의 오류 메시지가 의미가 있습니다.

원래의 게시물 :

는 그래서 "은 템플릿 인스턴스화가 사용하는 문장의 의미 론적 의미를 변경하는 것이 허용됩니다?", 진짜 질문은 나에게 보인다

그리고 대답은 허용되지 않습니다. 이 상호 작용이 표준의 저자에 의해 예견되고 의도되었는지는 나는 모른다. 그러나 내가 알 수있는 한, 섹션 10의 사용 선언과 섹션 17의 템플릿 초기화를 모두 표준을 따르는 것으로 참조하십시오. 예 : using T::X이 허용되며 예, 사용 선언은 T가 다음과 같을 때 상속되는 생성자가됩니다. X.

+4

[핵심 이슈 2070] (https://wg21.link/CWG2070)을 참조하십시오. –

+0

대단히 감사합니다. – OmnipotentEntity