타입 추론(type inference)이란 표현식의 타입을 컴파일러가 스스로 알아내는 기능이다. 타입 추론과 관련된 키워드는 auto 와 decltype 이 있다.
그 중 auto 키워드에 대해 알아보겠다.
auto 키워드는 다음과 같은 상황들에 사용한다.
1. 함수의 리턴 타입을 추론한다.
2. 구조적 바인딩에 사용한다. (C++ 17, 타입 지정하면 안됨)
3. 표현식의 타입을 추론한다.
4. 비타입(non-type) 템플릿 매개변수의 타입을 추론하는 데 사용한다.
5. decltype 에서 사용한다.
6. 함수에 대한 또 다른 문법으로 사용한다.
7. 제네릭 람다 표현식에서 사용한다.
변수를 선언할 때 타입 자리에 auto 키워드를 지정하면 그 변수의 타입은 컴파일 시간에 자동으로 결정된다.
auto x = 123; // x가 int 타입으로 결정된다.
위 예제는 사실 int 로 쓰나 auto 로 쓰나 별 차이가 없지만 복잡한 타입에는 편리하다.
auto result = getFoo(); // 복잡한 타입을 리턴하는 함수를 쉽게!
위처럼 작업하면 나중에 이 함수의 리턴 타입을 변경하더라도 코드에서 그 함수가 나온 모든 지점을 일일이 찾아서 고칠 필요가 없이 간단히 수정할 수 있다.
auto의 단점은 표현식의 타입을 추론할 때 함수에 지정된 레퍼런스나 const 한정자가 제거된다는 것이다.
const std::string msg = "Test";
const std::string& foo(){
return msg;
}
auto f1 = foo();
위와 같은 함수가 있다고 가정하고 foo() 의 결과를 auto로 지정한 변수 f1 에 저장하면 레퍼런스와 const 한정자가 사라지기 때문에 그냥 std::string 타입이 된다. 따라서 값이 복제되어 값에 의한 전달(pass by value)이 되어 버린다. 이는 다음과 같이 사용하여 수정할 수 있다.
const auto& f2 = foo();
덤) decltype 키워드는 추후에 따로 적겠지만 인수로 지정한 표현식의 타입을 알아낸다.
int x = 123;
decltype(x) y =456;
이렇게 작성하면 컴파일러는 y의 타입이 x의 타입인 int라고 추론한다.
decltype을 지금 설명하는 이유는 auto 와 달리 레퍼런스나 const 지정자를 삭제하지 않기 때문이다.
decltype(foo()) f2 = foo(); // 이렇게 작성하면 값이 복제되지 않는다.
decltype 은 템플릿을 사용할 때 매우 효과적이다.
'C | C++' 카테고리의 다른 글
C++ unique_ptr 스마트 포인터에 대한 매우 자세한 설명 (0) | 2022.09.30 |
---|---|
C++ Vector reserve( )와 resize( )의 차이 (0) | 2022.09.29 |
Rvalue reference 정리한 내용 (0) | 2020.11.20 |
const 와 readonly 의 차이 (0) | 2020.05.22 |
c++ 구조2 (0) | 2019.10.03 |