목록

2019년 6월 19일 수요일

[C++] nullptr, std::nullptr_t



nullptr 은 포인터 변수의 값으로 0을 전달하기 위해 C++11에서 새로 추가된 키워드입니다.
언듯 보면 대단히 쓸모없어 보이는 이 키워드는 그냥 포인터 변수에 정수 0을 대입하는것 보다 아주 약간 유용한 기능을 제공합니다.

바로 오버로딩 된 함수를 호출 시 무심코 0값을 전달하는 경우
정수형 인자를 받는 함수가 잘못 호출 될 수 있습니다.


  1. #include <string>
  2. #include <iostream>
  3.  
  4. void test(int v)
  5. {
  6.         std::cout << "call test(int)\n";
  7. }
  8.  
  9. void test(char *str)
  10. {
  11.         if (str)
  12.         {
  13.                std::cout << str << '\n';
  14.         }
  15.         else
  16.         {
  17.                std::cout << "str is null\n";
  18.         }
  19. }
  20.  
  21. int main()
  22. {
  23.         test(0);
  24.         test(nullptr);
  25. }


void test(char *str) 함수를 호출하고 str is null을 출력하고 싶은경우가 있다고 가정합니다.
무심코 0을 전달하면 void test(int v) 가 호출되버리고 맙니다.
하지만 nullptr 을 전달하면 nullptr 은 정수형으로 인식하지 않기 때문에 포인터 변수를 받는 void test(char *str)이 호출되게 됩니다.

만약 void test(int *pi) 도 있다면 어떻게 될까요?
그런 경우는 어떤것을 호출될지 모호하기 때문에 컴파일 타임 에러가 납니다.
그런 경우는 그냥 전달 전에 캐스팅 해서 어떤 함수를 호출할지 정해주어야합니다.
(int*)0 전달 또는 (int*)nullptr 전달


nullptr 을 매개변수로 전달 할 수 있는것을 보면 nullptr도 타입이 있겠죠?
auto a = nullptr; 이런식으로 작성해서 a의 타입을 확인해보면
std::nullptr_t 라는 타입이라고 나옵니다.
구조를 보려고 했는데 볼수가 없습니다. 그냥 bool, int 이런것처럼 새로운 타입입니다.

댓글 없음:

댓글 쓰기

목록