2017-05-22 16 views
1

저는 현재 제 3 자 C++ 코드를 사용하고 있습니다.이 코드는 제게는 이상하게 보입니다 (저는 C++ 11로 시작했습니다). 나에게 남아있는 많은 것들 중 하나는, 당황 몇 가지 포인터 유형 NULL에서 static_cast의 많은 경우 :C++에서 SomeType *에 NULL을 캐스트하는 용도는 무엇입니까?

SomeClass* someClassPtr = static_cast<SomeClass*>(NULL); 

난 당신이 예를 들어, 포인터를 캐스팅 수있어 기본 클래스 포인터에서 파생 클래스 포인터로,하지만 여기에는 전혀 상속이 없습니다. 최대한 멀리 볼 수있는,이 충분해야한다 :

: NULL 특정 포인터 타입으로 캐스트되지 않습니다이 코드에서

SomeClass* someClassPtr = NULL; 

그러나 유일한 케이스, 벡터와 다른 컨테이너에 포인터는

SomeOtherClass.vecOfSomeClassPtr[i] = NULL; 

그래서 제 질문은 다음과 같습니다

  • nullptr이 전에에서이 단순히 이전 스타일 (또는 C 스타일) 코드인가?
  • 상속을 사용하여 작업 할 때 down-/upcasting 이외의 다른 용도로 캐스팅되었습니다/NULL?
  • 아니면 완전히 빠진 것이 있습니까?

그리고이 경우에 나는 그것이 잘못까지 확보하지 않은 : 그 아무것도 끊을 경우
내가 먼저보고, NULL 나중에 nullptrstatic_cast<type*>(NULL)의 모든 인스턴스를 대체 : 아니. 컴파일러가 이의를 제기하지 않으며 프로그램이 예상대로 작동하는 것 같습니다. 는하지만, 그래서 포인터가 까다로운 작은 놈들 될 수 있습니다 알고

  • 아마 nullptr의 사용에 대한 어떤 함정을 그리워 했습니까?

추신 : 예, 검색을 사용했는데 예, C 코드에서 비슷한 질문을 발견했습니다. 그러나 이것은 C++ 코드이며 뭔가를 가정하는 대신 확실하게 알고 싶었습니다.

+2

한 가지 질문에 많은 질문이 있습니다. – user2079303

+0

미래를 염두에 두겠습니다. – Floriel

답변

4

C++에서 SomeType *에 NULL을 캐스트하는 용도는 무엇입니까?

SomeClass* someClassPtr = static_cast<SomeClass*>(NULL); 

캐스트는 이러한 맥락에 영향을주지 않습니다.

void stupidly_overloaded_function(int); 
void stupidly_overloaded_function(SomeClass*); 
void stupidly_overloaded_function(SomeOtherClass*); 

stupidly_overloaded_function(NULL); 

하는 기능이

를 호출됩니다 :

그러나 더 일반적으로, 그것은 과부하가 관련된 다른 맥락에서 이해합니까? 실제로는 NULL의 정의에 따라 다릅니다. int 오버로드를 호출하거나 모호성으로 인해 컴파일이 실패합니다.

캐스트 통화 구분할 수 있습니다

stupidly_overloaded_function(static_cast<SomeClass*>(NULL)); 

을 나는이 nullptr를 도입하기위한 중요한 이유라고 생각합니다.심지어 nullptr 여러 다른 포인터 오버로드를 처리 할 수는 없지만, 그것은 정수 사이에 명확 않습니다

define container_of(ptr, type, member) ({      \ 
     const typeof(((type *)0)->member) *__mptr = (ptr); \ 
     (type *)((char *)__mptr - offsetof(type,member));}) 
:

void not_quite_as_silly_overload(int); 
void not_quite_as_silly_overload(SomeClass*); 

not_quite_as_silly_overload(NULL); // might call either overload 
not_quite_as_silly_overload(nullptr); // unambiguously calls the pointer overload 

C의 또 다른 사건을 같은 리눅스 커널에서 container_of 매크로 같은 개체의 크기와 관련된 매크로입니다

여기서, NULL 대신 0 만 사용됩니다. I 은 캐스팅없이 C++로 구현 될 수 있다고 생각하지만 C++ 11에 도입 된 declval 만 사용하십시오.


는 nullptr이 전에에서이 단순히 이전 스타일 (또는 C 스타일) 코드인가?

아니요, 이러한 중복 된 캐스트에는 범용 스타일이 없습니다. 예제에는 오버로드가 없기 때문에 위의 경우는 해당되지 않습니다.

상속을 사용하여 작업 할 때 down/upcasting 이외의 다른 작업에 NULL을 사용해야합니까?

아니요, 과부하 해결에 필요했습니다 (여전히 다른 포인터 과부하의 경우입니다).

+0

그래서 함수 호출에서 이러한 캐스트를 대체 할 때 조심해야하지만 할당시 저장해야합니다. – Floriel

+1

@Floriel 확실히 동일한 유형의 포인터에 대한 지정이 안전합니다. 'nullptr'을 사용하는 한 함수 호출에 안전합니다. 과부하가 실패하면 빌드시에이를 볼 수 있습니다. – user2079303