C++/Modern C++(11, 14, 17, 20)
[C++11] nullptr
deulee
2023. 8. 26. 15:56
`nullptr`은 C++11로부터 도입된 키워드로, 포인터의 널(NULL) 값을 나타내는 "포인터 리터럴(pointer literal)"이다.
이전에 C++에는 포인터의 널 값을 `NULL`로 나타냈지만 `nullptr`는 `NULL`의 한계와 모호성을 해결하고자 나타났다.
`nullptr`의 주요 특징은 다음과 같다.
타입 안전성(Type Safety) : 이전에는 `NULL`이 "정수"로 표현되었기 때문에 포인터와 정수 간의 암시적 변환으로 인한 문제가 발생할 수 있었다. 하지만 `nullptr`는 포인터 타입에만 사용 가능하며, 타입간의 혼동을 방지한다.
다음 코드를 한번 보도록 하겠다.
#include <iostream>
void foo(int a)
{
std::cout << "I'm not pointer" << std::endl;
}
void foo(int* ptr)
{
std::cout << "I get a pointer as a parameter" << std::endl;
}
int main(void)
{
foo(NULL); // error - call to 'foo' is ambiguos
foo(nullptr); // call `void foo(int* ptr)`
return 0;
}
이것이 이렇게 나타나는 이유는 `NULL`은 널을 가리키는 포인터가 아니라 숫자 `0`이다. 그렇기 때문에 정수형으로 암시적 변환이 가능하기 때문에 에러가 나타나는 것이다.
그에 반해 `nullptr`은 그 자체로 `std::nullptr_t`타입이며 이는 어떤 포인터 타입이든 암시적으로 변환이 가능하다.