함수 제목의 화살표 연산자 (->)


128

다음 코드를 발견했습니다.

template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
   return a+b;
}

내가 이해할 수없는 한 가지가 있습니다.

->함수 제목에서 화살표 연산자 ( ) 가 무엇을 의미 하는지 어디에서 찾을 수 있습니까 ? 나는 순전히 논리적으로, ->연산자 auto가 추론 할 유형을 결정 한다고 생각 하지만,이 사실을 곧바로 이해하고 싶습니다. 정보를 찾을 수 없습니다.


2
후행 반환 유형 구문의 일부입니다. stackoverflow.com/a/4113390/962089
chris

2
연산자가 아니라 구문의 일부입니다.
texasbruce

1
"나는 어디에서 읽을 수 있습니까?"에 대한 대답으로 C ++ 사양이 가장 권위 있습니다. 자금이 부족하거나 $$를 지출하려는 욕구가있는 경우 마지막 작업 초안은 종종 충분하고 비용이 들지 않습니다. 이러한 사양은 매우 기술적 인 내용이므로 ISO 사양을 읽는 데 익숙하지 않은 경우 cplusplus.com 또는 cppreference.com 또는 권한이 없지만 일반적으로 매우 정확한 다른 사이트를 사용해보십시오. 참고 : 후행 반환 유형은 C ++ 14부터 생략 할 수 있습니다.
Les

답변:


205

C ++ 11에는 함수 선언을위한 두 가지 구문이 있습니다.

    반환 유형 식별자 ( 인수 선언 ... )

    auto 식별자 ( 인수 선언 ... ) -> return_type

동등합니다. 이제 동등 할 때 왜 후자를 사용하고 싶습니까? 음, C ++ 11 decltype은 표현식의 유형을 설명 할 수있는 이 멋진 것을 도입했습니다 . 따라서 인수 유형에서 반환 유형을 파생시킬 수 있습니다. 그래서 당신은 시도 :

template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);

컴파일러는 인수 에 무엇이 a있고 무엇인지 알지 못한다고 알려줍니다 . 이는 인수 목록에 의해서만 선언되기 때문입니다.bdecltype

declval이미 선언 된 및 템플릿 매개 변수를 사용하여 문제를 쉽게 해결할 수 있습니다 . 처럼:

template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);

지금은 정말 장황 해집니다. 따라서 대체 선언 구문이 제안되고 구현되었으며 이제 다음과 같이 작성할 수 있습니다.

template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);

덜 장황하고 범위 지정 규칙을 변경할 필요가 없습니다.


C ++ 14 업데이트 : C ++ 14는

    auto 식별자 ( 인수 선언 ... )

함수가 사용 전에 완전히 정의되고 모든 return명령문이 동일한 유형으로 추론되는 한. ->소스 파일에 몸을 숨기려면 구문 (헤더에 선언 된) 공공 기능에 대한 유용한 남아있다. 분명히 템플릿으로는 할 수 없지만, 다른 방법으로는 작성하기 어려운 몇 가지 구체적인 유형 (일반적으로 템플릿 메타 프로그래밍을 통해 파생 됨)이 있습니다.


2
매우 좋고 깔끔하며 유익한 답변 @Jan Hudec. 엄지 척. 변경 뭔가가 C++14내가 사용으로 auto대한 return를 필요로하지 않고 같은 기능의 유형 -> decltype(a + b)부분. 지금까지 중복됩니까? 아니면 여전히 사용해야하는 다른 경우가 있습니까? 아니면 컴파일러 특정 확장입니까?
Shadi

1
@Shadi, C ++ 14에는 함수가 사용 전에 완전히 정의되고 모든 문이 동일한 유형으로 추론되는 한 표기 없이 로 선언 된 반환 유형을 추론 할 수있는 N3638이 포함됩니다 . 이 표기법은 소스 파일에서 본문을 숨기는 동안 공용 기능에 대해 공제를 사용하려는 경우 여전히 유용합니다. auto->return->
Jan Hudec 2017

23

일반 영어에서는 반환 유형이 a및 합계의 유추 된 유형임을 알려줍니다 b.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.