프로그래밍 일반 2014. 4. 2. 14:31

C++ 11 auto initializer

웹 컴파일러 링크 : http://melpon.org/wandbox/


auto initializer 로부터 타입을 유추


예를 들어 


auto x = 7;


위 코드에서 x는 initializer의 타입이 int 이기 대문에 int 타입이 된다.


일반적으로 우리는 


auto x = expression;

과 같은 구문을 보면 x는 expression 타입이 될 것이라고 생각한다.


 auto 를 사용하는 주된 이유는 어떠한 식의 타입이 알기 어렵거나 쓰기 매우 길 경우이다. 예를 들어

template<class T> void printall(const vector<T>& v) {

for (auto p = v.begin(); p != v.end(); ++p) {

cout << *p << "\n";

}

}

와 같은 코드를 이전 C++ 코드에서는 

template<class T> void printall(const vector<T>& v) {

for (typename vector<T>::const_iterator p = v.begin(); p != v.end(); ++p) {

cout << *p << "\n";

}

}

으로 작성해야만 했다. 또한 변수의 타입이 템플릿 인자에 의해 좌우 될 때, 이를 auto를 사용하지 않고 코드를 작성하려면 매우 까다롭다.

template<class T, class U> void multiply(const vector<T>& vt, const vector<U>& vu) {

// ...

auto temp = vt[i] * vu[i];

// ...

}

temp 의 타입은 T와 U를 곱한 것의 타입이 되어야만 하며, 이는 사람이 얽었을 때 무엇인지 생각하기에 까다롭지만 컴파일러는 어떠한 T와 U에 대한 처리인지 알기 대문에 위와 같이 표현할 수 있다.


 auto는 1984년에 이미 구현되었지만 당시의 C와 호환성 문제 때문에 사용할 수 없었다가 C++98 과 C99 에서 암시적 int[각주:1] 라는 것을 삭제함으로써 사용할 수 있게 되었다. 이제 두 언어 모두 모든 변수와 함수가 반드시 명확한 타입으로 정의 되어야만 한다. auto의 옛날 의미[각주:2]는 이제 사용할 수 없다.



참고






  1. 형식이 지정되지 않으면 int로 간주한다. [본문으로]
  2. 이 변수는 지역 변수이다 void f() { auto int i = 0; // C++0x에서는 오류 //... } [본문으로]