함수 반환 타입 추론(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/
'C++ > C++14' 카테고리의 다른 글
C++14 : 숫자 구분자(Digit separators) (0) | 2022.04.15 |
---|---|
C++14 : 바이너리 리터럴(Binary literals) (0) | 2022.04.15 |
C++14 : 애그리게이트 멤버 초기화(Aggregate member initialization) (0) | 2022.04.15 |
C++14 : 변수 템플릿(Variable templates) (0) | 2022.04.15 |
C++14 : 완화된 constexpr 제약 (Relaxed constexpr restrictions) (0) | 2022.04.15 |
댓글