본문 바로가기
C++/C++14

C++14 : 함수 반환 타입 추론(Function return type deduction), 선언 시 대체 형 추론(Alternate type deduction on declaration)

by 개발자J의일상 2022. 4. 15.
반응형

함수 반환 타입 추론(Function return type deduction)

 

c++14에서 함수의 반환 값으로 auto를 사용하면 컴파일러는 자동으로 반환 형을 추론하려고 시도한다.

// C++14 program to illustrate the
// return type deduction
#include <iostream>
using namespace std;
  
// Function to multiply the two
// numbers a and b
auto multiply(int a, int b)
{
  
    // Return the product
    return a * b;
}
  
// Driver Code
int main()
{
    int a = 4, b = 5;
  
    // Function Call
    cout << multiply(a, b);
  
    return 0;
}
//Output : 20

위의 프로그램에서, multiply(int a, int b) 함수는 컴파일러가 곱셈을 수행한다. 전달된 매개변수 4와 5로 컴파일러는 20을 반환하고 데이터 타입이 정수이므로 컴파일러는 자동으로 타입을 정수로 추론하고 20을 정수로 반환한다.

 

// C++ 14 program to illustrate the
// return type deduction
#include <iostream>
using namespace std;
  
// Function to increment the
// value of a
auto increase(int& a)
{
    // Increment a
    a++;
  
    // Return the updated value
    return a;
}
  
// Driver Code
int main()
{
    int b = 10;
  
    // Function Call
    int& c = increase(b);
  
    // Print the value b and c
    cout << b << c;
    return 0;
}
//Output : Error!!

위의 프로그램에서 볼 수 있듯이 컴파일러는 오류를 표시한다. 이는 함수 증가(int& a)에서 컴파일러가 11을 반환하고 해당 타입이 정수이기 때문에 컴파일러가 해당 타입을 정수로 추론하여 반환하지만, 메인에서는 정수 값을 정수 레퍼런스 변수 c에 할당하기 때문이다. 이 이유 때문에 에러가 발생한다.

위의 문제는 두 가지 방법으로 해결할 수 있다.

 

1. auto& 를 반환값으로 사용한다.

// C++14 program to illustrate return
// type deduction using auto&
#include <iostream>
using namespace std;
  
// Function to increment the value
// of a and return the updated value
auto& increase(int& a)
{
    a++;
    return a;
}
  
// Driver Code
int main()
{
    int b = 10;
  
    // Function Call
    int& c = increase(b);
    cout << b << '\n'
         << c;
  
    return 0;
}
//Output : 11
//         11

2. 선언 시 대체 형 추론(Alternate type deduction on declaration)

// C++14 program to illustrate return
// type deduction using decltype()
#include <iostream>
using namespace std;
  
// Function that increments the value
// of a and return the updated value
decltype(auto) increase(int& a)
{
    a++;
    return a;
}
  
// Driver Code
int main()
{
    int b = 10;
  
    // Function Call
    int& c = increase(b);
  
    cout << b << '\n'
         << c;
  
    return 0;
}
//Output : 11
//         11

 

선언 시 대체 형 추론(Alternate type deduction on declaration)

 

C++11에서는 두 가지 타입 추론 방법이 추가되었다. 

auto는 주어진 표현식을 기반으로 적절한 타입의 변수를 생성하는 방법이다.

decltype은 주어진 표현식의 유형을 계산하는 방법이다. 

decltype과 auto는 다른 방식으로 타입을 추론한다. 특히 auto는 std::decay를 사용하는 것처럼 항상 비참조 유형을 추론하는 반면 auto&&는 항상 참조 유형을 추론한다.

반면 decltype은 표현식의 값 범주와 추론하는 표현식의 특성에 따라 참조 또는 비참조 유형을 추론하도록 유도될 수 있다.

int   i;
int&& f();
auto          x3a = i;     // decltype(x3a) is int
decltype(i)   x3d = i;     // decltype(x3d) is int
auto          x4a = (i);   // decltype(x4a) is int
decltype((i)) x4d = (i);   // decltype(x4d) is int&
auto          x5a = f();   // decltype(x5a) is int
decltype(f()) x5d = f();   // decltype(x5d) is int&&

 

C++14 decltype(auto) 구문을 추가했다. 이것은 auto 선언이 주어진 표현식에 대해 decltype 규칙을 사용할 수 있도록 한다. 

 

함수의 반환 타입 추론에 auto 대신 decltype(auto) 구문을 사용하여 위의 예제 처럼 decltype(auto) 구문을 반환 타입 추론과 함께 사용할 수도 있다.

 

https://google.github.io/styleguide/cppguide.html#Goals
https://en.wikipedia.org/wiki/C%2B%2B14#Alternate_type_deduction_on_declaration
https://www.geeksforgeeks.org/return-type-deduction-in-c14-with-examples/
300x250

댓글