C++ 후행 반환 타입(Suffix Return Type) - 10. C++ 표준별 지원 변화

2025. 3. 25. 17:11프로그래밍 언어/C++

 

10. C++ 표준별 지원 변화

후행 반환 타입(trailing return type)은 C++11에서 처음 도입되었으며, 이후 C++14, C++17, C++20을 거치며 다양한 관련 기능들이 추가되었습니다. 각 표준은 함수의 반환 타입을 보다 유연하고 안전하게 정의할 수 있도록 기능을 확장해 왔습니다.


✅ C++11: 후행 반환 타입, auto 및 decltype 도입

C++11은 후행 반환 타입 문법을 공식적으로 도입한 첫 번째 표준입니다. 이를 통해 복잡한 반환 타입을 함수 시그니처의 뒤쪽에 명시할 수 있게 되었으며, 템플릿 함수나 표현식 기반 타입 추론에서 큰 이점을 제공합니다.

auto add(int a, int b) -> int {
    return a + b;
}

이와 함께 도입된 auto는 변수 선언 시 타입을 자동으로 추론할 수 있게 하였고, decltype은 표현식의 정확한 타입을 추론할 수 있도록 해주었습니다.

decltype(1 + 2.0) x = 3.5;  // x는 double 타입

이 두 키워드는 후행 반환 타입과 결합하여 표현식 기반의 정밀한 반환 타입 명시가 가능하게 되었습니다.


✅ C++14: 함수 반환 타입 추론, decltype(auto) 도입

C++14에서는 함수의 반환 타입을 생략하고 자동으로 추론할 수 있는 기능이 추가되었습니다. 이로 인해 간단한 함수에서는 반환 타입을 별도로 명시하지 않아도 됩니다.

auto multiply(int a, int b) {
    return a * b;  // 반환 타입은 컴파일러가 int로 추론
}

또한 decltype(auto) 키워드가 도입되어, 반환 타입 추론 시 참조성과 const 성질을 유지할 수 있게 되었습니다.

const int x = 10;
const int& ref = x;

decltype(auto) y = ref;  // y는 const int&로 추론됨

이 기능은 후행 반환 타입 없이도 참조 반환을 명확히 처리할 수 있어, 템플릿 함수와 범용 함수 작성 시 유용한 도구로 자리 잡았습니다.


✅ C++17: 클래스 템플릿 인자 추론 (CTAD)

C++17에서는 클래스 템플릿 인자 추론(Class Template Argument Deduction, CTAD)이 도입되어, 객체 생성 시 명시적으로 타입을 지정하지 않아도 컴파일러가 생성자 인자를 바탕으로 템플릿 타입을 추론할 수 있게 되었습니다.

std::pair p{1, 2.5};  // std::pair<int, double>로 자동 추론

비록 후행 반환 타입 자체의 문법 변화는 없었지만, 템플릿 타입 추론 능력이 향상됨에 따라 후행 반환 타입과의 결합이 더 자연스러워지고 사용성이 높아졌습니다. 예를 들어 std::make_unique, std::make_pair 등의 함수에서 반환 타입을 명시하지 않고도 복잡한 타입을 안전하게 반환할 수 있습니다.


✅ C++20: Concepts와 requires 절을 활용한 타입 제약

C++20은 Concepts 기능을 도입하여 템플릿 인자에 대해 명시적인 타입 제약을 걸 수 있게 했습니다. 이로 인해 함수 선언에서 타입 안전성이 크게 향상되었으며, 후행 반환 타입과 requires 절을 함께 사용할 수 있습니다.

예시 1: requires 절과 후행 반환 타입

template<typename T>
auto absolute(T value) -> T
    requires std::is_arithmetic_v<T>
{
    return value < 0 ? -value : value;
}

예시 2: 축약형 Concept 사용

auto square(std::integral auto x) -> decltype(x * x) {
    return x * x;
}

이러한 문법은 후행 반환 타입과 결합되어 타입 조건 + 타입 표현을 동시에 명확하게 표현할 수 있게 해 줍니다. 특히 수학 연산 함수, 범용 알고리즘 등에서 타입 안전성과 코드 명료성을 동시에 확보할 수 있습니다.


✅ 요약

표준 버전 주요 변화 후행 반환 타입과의 관계
C++11 후행 반환 타입 문법 도입, auto, decltype 기본 문법 제공, 복잡한 타입 표현 가능
C++14 반환 타입 자동 추론, decltype(auto) 참조 반환 추론 가능, 함수 선언 간결화
C++17 CTAD (클래스 템플릿 인자 추론) 템플릿 기반 반환 타입과 더 잘 어우러짐
C++20 Concepts, requires 절 도입 반환 타입 선언과 타입 제약을 통합 표현 가능