프로그래밍 언어/C/C++

[C++11] Type Inference: auto

소혼 2013. 11. 1. 22:56
반응형

목차로 가기


<개인적으로 공부한 내용들로, 내용이 완벽하지 않을 수 있습니다. 부족한 부분/틀린 부분에 대한 Comment 환영합니다.>


- 업데이트
 * ts님이 지적해주신 제목 오타 수정

C/C++(C++11 이전의 C++)은 어떤 변수를 사용하려면 변수의 타입을 지정하여 선언(Declaration)을 해야만 합니다. 예를 들면 아래처럼 말입니다.

### c++

int a;

char b;


그러나, 템플릿과 STL등을 사용하다보면 어떤 타입을 지정하여 선언한다는 것이 간단한 일이 아닙니다.

예를 들어 아래처럼 복잡한 타입을 선언해야 할 수 있습니다. (내용은 타 코드에서 아무렇게나 가져왔습니다.)

### c++

HashMap<int, RefPtr<StaticPropertyAnalysis>, WTF::IntHash<int>, WTF::UnsignedWithZeroKeyHashTraits<int>> map = getMap();


이를 위해 C++11에서 등장한 두가지 타입 추론(Type Inference) 방법중 하나가 바로 auto 입니다.

위 문장은 간단히  아래와 같이 선언할 수 있습니다.

### c++

auto map = getMap();

위 문장에서 map의 타입은 compile타임에 getMap의 반환값의 타입에 맞춰 변환될 것입니다.


사실 기존에 auto라는 키워드가 이미 존재했습니다. 스토리지 클래스(storage class)들 중 하나로 지역 변수(local variable)들의 기본 스토리지 클래스였습니다.


이 때 사용하던 auto의 용법은 아래와 같습니다.

### c

auto int i;


그러나 c++11을 사용하면 이 구문은 더이상 유효하지 않습니다.

다시말해, 위 예제를 그냥 c++11이전의 표준 컴파일러로 빌드하면 문제가 없지만 c++11 컴파일러로 빌드하면, 아래와 같은 에러가 발생합니다. (gcc 기준)

auto.cpp: In function ‘int main()’:
auto.cpp:5:14: error: two or more data types in declaration of ‘i’


기존의 auto는 머리속에서 지워버리고(최소한 c++에서는), 이제 c++11에서 다시 등장한 auto에 익숙해지기 위해 몇가지 예제를 보도록 하겠습니다.

### c++

auto i = 5; // i는 integer입니다.
auto str = "string"; // str은 string입니다.
auto* p = new Person; // p는 Person*입니다.
const auto* cp = p; // cp는 const Person*입니다.
auto& r = *p; // r는 Person&입니다.


위 코드를 디버거(gdb)로 실행해보면 아래와 같은 값들을 얻을 수 있습니다.

(gdb) p str
$7 = 0x40095c "str"
(gdb) p i
$8 = 5
(gdb) p p
$9 = (Person *) 0x602010
(gdb) p cp
$10 = (const Person *) 0x602010
(gdb) p r
$11 = (Person &) @0x602010: {name = 0x400960 "ryuan"}


auto의 위력은 STL을 이용해 반환값을 선언하거나, iterator와 같은 코드를 구현할 때 진가를 발휘합니다.

예를 들어, 아래는 vector를 탐색하는 흔한 for loop입니다.

### c++

for (std::vector<int>::const_iterator itr = myvec.cbegin(); itr != myvec.cend(); ++itr)

이것을 auto를 이용하면 아래와 같습니다.

### c++

for (auto itr = myvec.cbegin(); itr != myvec.cend(); ++itr)



참조 1 : http://en.wikipedia.org/wiki/C%2B%2B11

참조 2 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2546.htm

참조 3 (storage class) : http://msdn.microsoft.com/en-us/library/w9hwbe3d%28v=vs.80%29.ASPX

반응형

'프로그래밍 언어 > C/C++' 카테고리의 다른 글

[C++11] Variadic template  (0) 2013.11.06
[C++11] unique_ptr  (7) 2013.11.01
c++11 스터디(목차)  (0) 2013.11.01
constructor/destructor에서 virtual method의 호출  (0) 2013.02.27
GCC 옵션 : version script  (0) 2012.08.14