오랜만에 팀 블로그에 C++0x 관련 글을 올립니다.
이미 알고 계시겠지만 Visual Stuido 2010 Beta2에 새로운 C++0x 기능이 추가 되었습니다.
추가된 것은 nullptr 이라는 키워드 입니다.
nullptr은 C++0x에서 추가된 키워드로 널 포인터(Null Pointer)를 나타냅니다.
null_ptr이
필요한 이유
C++03까지는 널 포인터를 나타내기 위해서는 NULL 매크로나 상수 0을 사용하였습니다.
그러나 NULL 매크로나 상수 0을 사용하여 함수에 인자로 넘기는 경우 int 타입으로 추론되어 버리는 문제가 발생 합니다.
< List 1 >
#include <iostream>
using namespace std;
void func( int a )
{
cout << "func
- int " << endl;
}
void func( double *p )
{
cout << "func
- double * " << endl;
}
int main()
{
func( static_cast<double*>(0)
);
func( 0 );
func( NULL
);
getchar();
return 0;
}
< 결과 >
첫 번째 func 호출에서는 double* 로 캐스팅을 해서 의도하는 func이 호출 되었습니다. 그러나 두 번째와 세 번째 func 호출의 경우 func( doube* p ) 함수에 널 포인터로 파라미터로 넘기려고 했는데 의도하지 않게 컴파일러는 int로 추론하여 func( int a )가 호출 되었습니다.
바로 이와 같은 문제를 해결하기 위해서 nullptr 이라는 키워드가 생겼습니다.
nullptr 구현안
C++0x에서 nullptr의 드래프트 문서를 보면 nullptr은 아래와 같은 형태로 구현 되어 있습니다.
const class {
public:
template <class T>
operator T*() const
{
return 0;
}
template <class C, class T>
operator T C::*() const
{
return 0;
}
private:
void operator&() const;
} nullptr = {};
nullptr 사용 방법
사용방법은 너무 너무 간단합니다. ^^
그냥 예전에 널 포인터로 0 이나 NULL을 사용하던 것을 그대로 대처하면 됩니다.
<List1>에서 널 포인트를 파라미터로 넘겨서 func( double* p )가 호출하게 하기 위해서는
로 호출하면 됩니다.
nullptr의 올바른 사용과 틀린 사용 예
올바른 사용
char* ch = nullptr; // ch에 널 포인터 대입.
sizeof( nullptr ); // 사용 할 수 있습니다. 참고로
크기는 4 입니다.
typeid( nullptr ); // 사용할 수 있습니다.
throw
nullptr; // 사용할 수 있습니다.
틀린 사용
int n = nullptr; // int에는 숫자만 대입가능한데
nullptr은 클래스이므로 안됩니다.
Int n2 = 0
if( n2 == nullptr ); // 에러
if( nullptr ); // 에러
if( nullptr == 0 ); // 에러
nullptr = 0; // 에러
nullptr + 2; // 에러
nullptr 너무 간단하죠? ^^
VC++ 10에서는 예전처럼 널 포인터를 나타내기 위해서 0 이나 NULL 매크로를 사용하지 말고 꼭 nullptr을 사용하여 함수나 템플릿에서 널
포인터 추론이 올바르게 되어 C++을 더 효율적으로 사용하기 바랍니다.^^
왜 nullptr 이라고
이름을 지었을까?
nullptr을 만들 때 기존의 라이브러리들과 이름 충돌을 최대한 피하기 위해서 구글로 검색을 해보니 nullptr로 검색 결과가 나오는 것이 별로 없어서 nullptr로 했다고 합니다.
제안자 중 한 명인 Herb Sutter은 현재 Microsoft에서 근무하고 있는데 그래서인지 C++/CLI에서는 이미 nullptr 키워드를 지원하고 있습니다.
C++0x 이야기
근래에 Boost 라이브러리의 thread 라이브러리가 C++0x에 채택 되었다고 합니다. Boost에 있는 많은 라이브러리가 C++0x에 채택되고 있으므로 컴파일러에서 아직 지원하지 않는 C++0x의 기능을 먼저 사용해 보고 싶다면 꼭 Boost 라이브러리를 사용해 보기 바랍니다.
참고
http://d.hatena.ne.jp/faith_and_brave/20071002/1191322319
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf
http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/nullptr
http://d.hatena.ne.jp/KZR/20080328/p1
'C++0x' 카테고리의 다른 글
[Plus C++0x] 람다(Lambda) 이야기 (2) (1) | 2010.05.27 |
---|---|
[Plus C++0x] 람다(Lambda) 이야기 (1) (0) | 2010.05.27 |
"Visual C++ 10과 C++0x" pdf 파일 (4) | 2010.04.20 |
C++0x 관련 책 "Visual C++ 10과 C++0x" (9) | 2010.04.17 |
VC++ 10에 구현된 C++0x의 코어 언어 기능들 (1) | 2010.04.12 |