C++ 0x의 초안이 나옵니다

via Sutter’s Mill: Trip Report: June 2008 ISO C++ Standards Meeting

C++ 표준위원회의 일원이기도 한 Hurb Sutter의 블로그에 C++ 0x의 초안에 관한 포스팅이 올라왔습니다. 오는 9월에 초안이 나올 예정이라고 합니다. 초안이긴해도 현재의 C++ 표준은 돈 주고 사야해서 보통은 공짜로 볼 수 있는 초안을 보는 현실을 감안하면 큰 차이가 없으니 그걸 새 표준으로 생각하면 될듯도. …그리고 많은 컴파일러 제조사들도 일단 그걸 기준으로 컴파일러를 만들어낼테니.

일단 이전 포스팅 – 주로 Hurb Sutter 의 – 내용이랑 이번 포스팅 내용을 보면,

Concept

허브 서터의 포스팅에서는 컨셉(concept)이 추가되는게 제일 큰 변화라고 말하고 있습니다. Java의 interface 개념이랑 눈꼽만큼 닮아있는데, 기존에는 type_traits 같은 개념으로 해결했던 문제를 위한 것이다.

템플릿자체가 컴파일 시간에야 말이 되나 안되나가 — instantiate되느냐 마느냐가 – 결정된다는 문제가 있어서, 이런 문제도 좀 해결하고 – 특정 연산의 존재를 “강제”한다. 즉, SGI의 STL 문서에서 흔히 보게되는 comparable, assignable 같은 “개념”들을 C++ 언어 시스템 자체에 통합 시키려는 시도다. Java의 interface보다는 느슨한 개념이지만 지금 사용하고 있는 type_traits 같은 것보단 훨씬 이해하기 쉬울 거라고 믿고있음.

위에서 링크한 초안…에 포함될 문서에있는 예를 가져오면,

template<LessThanComparable T>
const T& min(const T& x, const T& y) {
    return x < y? x : y;
}

SGI STL 문서에 있는 Less-than-comparable 의 “개념”인데, 이걸 언어 차원으로 강제하는 것. 즉 기존의 typename 키워드 대신에 LessThanComparable 을 어딘가에 정의하고 < 연산자가 존재하는 것을 강제하게하자는 얘기.

Auto

Hurb Sutter의 포스팅에 나온 것. GCC(g++) 사용자라면 typeof 란 연산자를 본 적이 있을텐데, 대충 이런 짓을 할 수 있다.

map< int, float > ifm;
typeof(ifm.begin()) i = ifm.begin();

즉, template 타입처럼 복잡한 타입의 이름을 “추론해서 쉽게 얻어낼 수 있는 곳”에서 이걸 사용자가 귀찮게 생각하지 않아도 되는 syntactic sugar – 적어도 내 생각엔 – 을 주는 것. C++ 0x에서는 다음과 같은 형태다.

auto i = ifm.begin();

auto 라는 키워드가 저런 용도로도 사용할 수 있게 되는 것. 그리고 링크한 글에선 저 키워드의 필요성을 lambda/closure 1 같은 경우에 함수 타입이 굉장히 복잡하게 표현되는데, 그럴 때는 거의 상식적으로 가능한 유일한 대안이라는 점에서 설명하고 있다.

기타

이 외에도 boost::assign 대신 편하게 쓸 수 있는 대입 연산 관련된 항목들 – 초기화 리스트 – , Windows API에서 사용할 수 있는 thread local storage 한정자2 thread_local이 생기게 된다는 점 등등 뭐 바뀌는게 많다.

하지만 언제 쓸 수 있을지는 :$


  1. 역시 C++ 0x에 추가되는 개념이다. 전에 한 번 포스팅 했음↩︎

  2. 명시적인 thread key – value 쌍 말고 데이터 타입의 선언. ↩︎