c++에서의 NULL과 nullptr
c++에서의 c와는 조금 다르게 Null을 정수의 0으로만 정의하며(MACRO를 통해)
사용하기에 유효하지 않은 메모리의 0번지에 접근하게합니다.
그렇게 함으로 NULL 포인터 상수를 다룹니다.
c++11미만의 경우 : int 0으로 평가되는 rvalue
c++11이상의 경우 : 정수 리터럴 0, std::nullptr_t 타입의 prvalue
앞서 c와는 조금 다르다 하였는데 c는 (void*)0의 방식도 사용합니다.
이 방식은 (void*)의 특성상 여러 포인터로 변환이 가능하기에
이를 위험하다 판단하여 c++에서는 c++ c와의 호환을 위해서
0만을 MACRO를 통해 정의해 NULL 포인터 상수를 다룹니다.
(정보출처 : https://stackoverflow.com/a/69057243/18325764)
이렇게 c++은 정수형 0을 NULL 포인터 상수로 다루기에
다음과 같은 함수의 오버로딩에서 모호함의 문제가 나타날 수 있습니다.
0이 내부적으로 정수의 역할과 포인터 상수로써 두 역할을 하는 셈입니다.
nullptr의 도입
그래서 이러한 문제를 해결하기 위해 C++11 부터는 nullptr이 도입되었습니다.
nullptr은 포인터 리터럴로 기존의 NULL과는 다르게 0과 구분됩니다.
nullptr은 std::nullptr_t이라는 타입을 가지며
여러 포인터로 암시적 형변환이 가능합니다.
(위에서는 이러한 방식이 위험하여 0으로만 NULL을 다룬다 하였는데
이는 수용하기로 한 것 같다고 조심스럽게 생각한다.)
그리고 nullptr을 사용함으로 그 목적이 뚜렷해 안전하게 쓸 수 있으며 가독성에도 이롭다.
아직 여러 라이브러리에서는 NULL이 많이 보이고 nullptr도 같이 쓰이지만
modern c++관점에서는 nullptr을 사용하는 것이 더욱 바람직하다고 본다.
읽어봐 주셔서 감사합니다. 부족한 부분은 사소한 부분이더라도 알려주시면 감사하겠습니다.