>백엔드 개발 >C++ >C 20 클래스 템플릿 생성자가 중복 템플릿 매개변수 목록을 생략할 수 있습니까?

C 20 클래스 템플릿 생성자가 중복 템플릿 매개변수 목록을 생략할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-19 15:12:03400검색

Can C  20 Class Template Constructors Omit Redundant Template Parameter Lists?

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()를 템플릿 S 내의 생성자 선언으로 허용했지만 C에서는 20에는 대신 S()가 필요합니다. 이 변경 사항은 중복성을 효과적으로 제거하고 잠재적인 오류 발생 가능성을 해결하는 CWG 2237과 일치합니다.

따라서 -std=c 20을 사용하는 GCC 트렁크에서 발생한 오류는 버그가 아니라 중단을 나타냅니다. C 20에 도입된 변경 사항입니다. 이 변경 사항을 아직 구현하지 않은 컴파일러는 계속해서 이전 코드를 성공적으로 컴파일하는 반면 이를 구현한 컴파일러는 새 코드를 준수합니다. 요구사항입니다.

위 내용은 C 20 클래스 템플릿 생성자가 중복 템플릿 매개변수 목록을 생략할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.