함수 매개 변수의 템플리트 인수 자리 표시자인 'auto'


22

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의 합법적 인 구문입니까?


내가들은 바에 따르면, 제한되지 않은 것은 templatised로 auto 직접 변환되는데 typename XYZ, 이것이 합법적 인 구문이라는 것을 암시합니다. 깔끔 합니다.
Fureeish

2
Clang은 동의하지 않으며 Clang과 GCC auto는 허용 [](const std::pair<auto, auto>& p){}여부 ( -std=c++2a또는 에 관계없이 ) 에 대해 동일한 의견에 동의하지 않습니다 -std=c++17.
호두


@DavisHerring 감사합니다-나는 문구를 수정했습니다
Amir Kirsh

답변:


17

이 구문은 C ++ 개념 기술 사양에서는 유효하지만 C ++ 20에서는 유효하지 않습니다. C ++ 20 개념에서는 auto함수 매개 변수 유형의 최상위 레벨에서만 허용됩니다. 관련 규칙은 [dcl.spec.auto] 단락 2입니다 .

자리 형 지정자 폼의 타입 제약 [옵트] autoA와 사용될 수 않거나 계산 지정자않거나 계산 지정자-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));

와우, 나는 몰랐다! CWG 링크는 현재 404를 제공하므로이 제한에 대한 이론적 근거를 간단히 설명 할 수 있습니까?
LF

이것은 완전히 실망입니다.
Fureeish

1
죄송합니다. CWG 문제 및 문구 변경 사항은 아직 공개적으로 표시되지 않습니다. 해당 규칙은 open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1141r2.html에 의해 도입되었으며 의도 / 이론은 우리가 일반적인 람다에 대해 이미 허용 한 것과 일치해야했습니다.
Richard Smith

4
@LF : CWG 문제는 실제로 관련이 없습니다 auto. 후행 리턴 유형 에 대한 특정 용도가 이러한 종류의 auto사용법 으로 계산 되었음을 암시하는 문구 오류를 수정했습니다 .
Davis Herring
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.