C 20의 클래스 템플릿 생성자에 있는 중복 템플릿 매개변수 목록
중복 템플릿 매개변수 목록을 갖는 클래스 템플릿 생성자의 유효성에 대한 논쟁이 계속되었습니다. C 20 소개. 문제와 해결 방법은 다음과 같습니다.
C에서 17에서 아래 코드는 올바른 형식으로 간주되었습니다.
template<typename T> struct S { S<T>(); };
그러나 C 20에서는 동일한 코드가 -std=c 20 아래의 일부 컴파일러(예: gcc 트렁크)에서 오류를 유발합니다.
error: expected unqualified-id before ')' token 3 | S<T>(); ^
C의 변화 20
C 20 표준에서는 클래스 템플릿 생성자 선언 구문의 변경을 요구합니다. 표준 호환성 섹션의 다음 델타는 이를 강조합니다.
[diff.cpp17.class] ... Change: A simple-template-id is no longer valid as the declarator-id of a constructor or destructor. Rationale: Remove potentially error-prone option for redundancy. ...
기본적으로 이전 코드에 사용된 "중복" 템플릿 매개변수 목록 S
template<typename T> struct S { S(); // CORRECT C++20 syntax };
이유
이 변경의 이유는 다음을 허용하지 않음으로써 오류 위험을 줄이는 것입니다. 간단한 템플릿 ID를 사용합니다. 주입된 클래스 이름을 명시적으로 사용하도록 강제함으로써 컴파일러는 의도한 생성자를 더 정확하게 확인할 수 있습니다.
결론
C 20의 이 변경 사항은 버그로 간주되지 않습니다. 가 아니라 클래스 템플릿 생성자 선언의 명확성과 정확성을 높이기 위한 의도적인 주요 변경 사항입니다. 이로 인해 이전 구문에 의존하는 기존 코드와의 호환성 문제가 발생할 수 있지만 궁극적으로 C 애플리케이션의 전반적인 안전성과 신뢰성이 향상됩니다.
위 내용은 C 20 클래스 템플릿 생성자에 중복 템플릿 매개변수 목록이 허용됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!