C ++ 20에서는 auto
함수 매개 변수 유형을 사용할 수 있습니다 .
또한 사용 수 있습니까 auto
템플릿 인수 자리 표시 자 (유사하지 만의 정신에서 C ++ 17 템플릿 <자동> 방식) 함수의 매개 변수 유형을 검색 하시나요?
따라서 C ++ 20 이전 코드는 다음과 같습니다.
template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
std::cout << p.first << ", " << p.second;
}
다음과 같이 쓸 수 있습니다 :
void printPair(const std::pair<auto, auto>& p) {
std::cout << p.first << ", " << p.second;
}
그것은 개념에 대한 실험적인 GCC 구현으로 컴파일하고 잘 작동합니다 .
C ++ 20의 합법적 인 구문입니까?
답변
이 구문은 C ++ 개념 기술 사양에서는 유효하지만 C ++ 20에서는 유효하지 않습니다. C ++ 20 개념에서는 auto
함수 매개 변수 유형의 최상위 레벨에서만 허용됩니다. 관련 규칙은 [dcl.spec.auto] 단락 2입니다 .
자리 형 지정자 폼의 타입 제약 [옵트]
auto
A와 사용될 수 않거나 계산 지정자 의 않거나 계산 지정자-SEQ (A)의 매개 변수 선언 함수 선언 또는 람다 표현식 가 아닌 경우, 및 후행 리턴 유형 (아래 참조)을 도입 한auto
유형 지정 자는 함수 선언 또는 람다 표현식 의 일반 매개 변수 유형 플레이스 홀더 입니다.. [참고 : 일반 매개 변수 유형 자리 표시자는 함수가 축약 된 함수 템플릿 (9.3.3.5 [dcl.fct])이거나 람다는 일반 람다 (7.5.5 [expr.prim.lambda])임을 나타냅니다. — 끝 참고]
(작성 당시 가장 최근의 초안에서 문구를 확인하면 약간 다른 규칙을 찾을 수 있습니다. 위의 규칙은 프라하에서 C ++ 20 최종 초안으로 선정 된 핵심 문제 2447에 의해 수정되었습니다. 일주일 전위원회 회의)
함수 매개 변수 의 decl-specifier 는 매개 변수 선언 시작시 키워드 및 유형 이름의 초기 순서입니다. 위의 규칙은 auto
최상위 수준에서 허용 합니다.
void f(auto x);
…하지만 decl-specifier 로만 사용됩니다 . decl-specifierauto
내에 중첩 된 경우 허용되지 않습니다 .
void f(std::vector<auto> x);
… 그리고 매개 변수 유형의 다른 곳에서도 허용되지 않습니다.
void f(void (*p)(auto));