함수의 반환 타입을 함수 시그니처에서 함수 이름 뒤에 명시하는 방법입니다. 이는 템플릿 함수에서 유용하게 사용되며, 복잡한 반환 타입을 다룰 때 가독성을 높이고 코드의 유지보수성을 개선할 수 있습니다.
auto 키워드를 사용하여 반환 타입을 지정하고, 반환 타입을 '->' 기호 뒤에 작성하는 방식입니다.
가벼운 예시
#include <iostream>
auto add(int a, int b) -> int {
return a + b;
}
후행 반환 타입은 반환 타입을 함수 선언부의 맨 뒤로 보내 가독성을 높이거나, 컴파일러가 반환 타입을 추론할 수 없을 때 명시적으로 알려주기 위한 현대 C++의 문법입니다.
반환 타입 이름이 길 때
#include <iostream>
#include <map>
#include <vector>
// 반환 타입이 길어서 가독성이 떨어질 수 있습니다.
std::map<int, std::vector<std::string>> func1() { }
auto func2() -> map<int, std::vector<std::string>> { }
템플릿 함수 사용에서
#include <iostream>
// 반환 타입을 먼저 읽다보니 매개 변수를 다시 확인 후 반환 타입을 다시 확인하게 됩니다.
template<typename T, typename U>
decltype(a + b) add1(const T a, const U b) {
return a + b;
}
template<typename T, typename U>
auto add2(const T a, const U b) -> decltype(a + b) {
return a + b;
}
람다 함수는 int calc 같은 일반적인 함수 형식으로 선언할 수 없어서 auto를 사용하는데, 이 auto는 컴파일러에게 "타입을 자동으로 추론해라"고 지시하는 것입니다.
그런데 람다의 반환 타입이 복잡하거나, 컴파일러가 자동으로 추론할 수 없을 때 (주로 재귀 람다나 템플릿과 함게 사용할 때) -> int와 같은 후행 반환 타입을 사용해 명시적으로 타입을 지정해주는 것입니다.