C 20에서 클래스 템플릿 생성자가 중복된 템플릿 매개변수 목록을 가질 수 있나요?
C 17에서는 클래스 템플릿 생성자를 선언하는 것이 허용되었습니다. 다음 예시와 같이 중복 템플릿 매개변수 목록이 있는 경우 code:
template<typename T> struct S { S<T>(); };
그러나 C 20의 출현과 호환성 변경 구현으로 인해 앞서 언급한 코드는 이제 GCC 트렁크(-std=c 20의 경우)에서 오류를 발생시킵니다. 반면 Clang 트렁크는 문제 없이 코드를 컴파일합니다. 이러한 불일치로 인해 다음과 같은 질문이 생깁니다. 이것이 버그입니까, 아니면 아직 컴파일러 전반에 완전히 구현되지 않은 의도된 주요 변경 사항입니까?
대답
답은 다음과 같습니다. C 20 사양의 미묘한 변화. 특히 다음 섹션이 수정되었습니다.
[class.ctor]
"생성자는 선언자가 다음 형식의 함수 선언자인 선언에 의해 도입됩니다.
ptr-declarator ( parameter-declaration-clause ) noexcept-specifier attribute-specifier-seq
ptr-declarator가 id-expression, 선택적 attribute-specifier-seq, 및 선택적 괄호로 둘러싸여 있으며 id-표현식은 다음 형식 중 하나를 갖습니다."
클래스 템플릿 내의 멤버 선언의 경우 id-표현식은 이제 삽입된 클래스 이름이어야 합니다. 즉시 둘러싸는 엔터티.
따라서 C 17에서는 S
따라서 -std=c 20을 사용하는 GCC 트렁크에서 발생한 오류는 버그가 아니라 중단을 나타냅니다. C 20에 도입된 변경 사항입니다. 이 변경 사항을 아직 구현하지 않은 컴파일러는 계속해서 이전 코드를 성공적으로 컴파일하는 반면 이를 구현한 컴파일러는 새 코드를 준수합니다. 요구사항입니다.
위 내용은 C 20 클래스 템플릿 생성자가 중복 템플릿 매개변수 목록을 생략할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!