C++0x 미리보기 11, auto의 새로운 용법
타이핑과 삽질을 줄이는 auto(의 새로운 용법)를 소개합니다.
- 제안의 명칭: Deducing the type of variable from its initializer expression
- 제안자: J. Ja:rvi, B. Stroustrup, G. Dos Reis
- 관련 문서: N1984
아마도 C++0x에서 가장 인기 있는 기능이 auto
일 것입니다. auto
를 잘 말해주는 예로, 현재(C++03)는
for (vector<string>::const_iterator it = v.begin(); it!=v.end(); ++it)
라고 써야 하는 것을 C++0x에서는
for (auto it = v.begin(); it!=v.end(); ++it)
라고 쓸 수 있습니다. (물론 이런 루프라면 범위 기반 for를 사용하는 게 더 낫겠지만요.)
그런데 이 예는 “타이핑 줄이기”에 해당합니다. 즉, 답을 알긴 알지만(STL을 적극적으로 사용하는 프로그래머라면 v.begin()
의 반환 형식을 이미 외우고 있겠지요) 적기가 귀찮을 뿐인 상황입니다. auto
는 이런 단순한 타이핑 줄이기보다는, 답 자체를 알아내거나 표현하는 게 힘든 상황에서 더욱 빛을 발합니다. 예를 하나 들자면(http://www.research.att.com/~bs/C++0xFAQ.html#auto에서 인용):
template<typename T, typename U>
void f(const vector<t>& vt, const vector<u>& vu)
{
// ...
auto tmp = vt[i]*vu[i];
// ...
}
auto가 없다고 할 때, 임의의 형식의 두 값을 곱한 결과의 형식을 표현하려면 템플릿 메타프로그래밍이 필요합니다. 이를테면:
typename ProductType<T,U>::type tmp = vt[i]*vu[i];
두 형식의 곱의 가장 자연스러운 형식을 돌려주는 ProductType<T,U>
라는 메타 함수를 만드는 게 아주 어려운 일은 아니겠지만, 코드에서 하고자 하는 일의 간단함에 비하면(그냥 두 수의 곱을 구하는 것일 뿐인데!) 좀 과하지 않을까요. Boost에 이미 있을 수도 있습니다만...
심지어, T
와 U
가 명시적으로 드러나 있다고 해도 쉽지가 않습니다. 다음에서 ???는 무엇이 되어야 할까요?
void f(const vector<int>& a, vector<float>& b)
{
// ...
??? tmp = vt[i]*vu[i];
// ...
int
와 float
을 곱한 결과를 최대한 정확하게 보존하되 메모리를 너무 낭비하지는 않은 형식이 무엇인지를 알려면 C++ 표준도 봐야 하고 구체적인 컴파일러의 문서화도 봐야 할 것입니다. 그러나 auto
가 지원된다면 고민할 필요가 없습니다.
auto
의 유용함은 이 정도로 하고, 몇 가지 세부적인 사항들을 이야기하자면:
*
나&
,const
도 통상적인 방식대로 적용할 수 있습니다:auto* p = new SomeLengthyName(); // p의 형식은 SomeLengthyName* int f(); const auto& x = f(); // x의 형식은 const int&
short
,long
,unsigned
,singed
등과 함께 사용할 수 있습니다. 물론 뜻이 통하는 경우에만 해당합니다. 예를 들어long auto s = string("foo");
는 안 됩니다(long string
이라는 것은 없으므로).auto
의 기존 용법, 즉 주어진 변수가 자동 변수(지역 변수)임을 명시하는 용법은 폐기됩니다:
void f()
{
auto int i = 0; // C++0x에서는 오류
//...
}
- N1984에 제안된 표준 문구를 보면 “A member shall not be declared with auto, extern or register storage class.”라고 되어 있으나, 이것이 멤버 선언에
auto
라는 키워드를 사용하면 안 된다는 뜻은 아닌 것으로 보입니다. 단지 이것은 클래스의 멤버를 선언할 때 특정한 저장 부류를 지정할 수 없다는 뜻일 뿐이라고 봐야 할 것입니다. - 이렇게 편리한 것이 이제야 도입되었다는 게 이상할 수도 있겠는데, http://www.stroustrup.com/C++11FAQ.html#auto를 보면 BS는 이런 기능을 벌써 1984년에 구현했었지만 C와의 호환성 때문에 포기할 수밖에 없었다고 합니다. 호환성 문제가 된 것은 C의 “암묵적 int” 규칙(형식이 지정되지 않으면
int
로 간주한다는)이었는데, C99에 와서야 그 규칙이 사라졌습니다.
다음 회에서는 auto
의 형제라 할 수 있는 decltype
을 다루겠습니다.
예전 댓글(읽기 전용)
-
잘 정리하셨네요. 잘 읽고갑니다. ^^
-
꾸준히 올리겠습니다~
-
초보, 2009-05-16 21:05 :
C++ 에 드디어 타입추론 기능이 들어가는군요. (java에 이 기능이 없는 것에 상심하여 scala 에 한쪽발을 담근 1인...)
-
우왓. 최강이닷.
-
흠 괜찮은데요... 하지만 후배 프로그래머들이 이렇게 편한것들을 계속 공부하게 되면 점점 파워 프로그래머들이 줄어들지 않을지 않을까요??? 편한만큼 새로운 문제에 대한 대처도 느려질것 같네요...
-
비율은 줄겠지요...
-
BOOST_AUTO 를 써서 그런지, 무척 기대 됩니다. ^^
다른건 몰라도 이 기능은 축복이네요.