내가 더 찾을 수 있지만 명시 적 이에 언급 C ++ 표준 작업 초안 (2014)로부터의 변환 std::nullptr_t
필수 유형이 금지되어, 이러한 변환이 허용되는지에 대한 언급도 없다!
그러나의 변환의 경우 std::nullptr_t
에이 bool
됩니다 명시 적으로 언급 :
4.12 부울 변환
산술, 범위가 지정되지 않은 열거 형, 포인터 또는 멤버 유형에 대한 포인터의 prvalue를 bool 유형의 prvalue로 변환 할 수 있습니다. 0 값, 널 포인터 값 또는 널 멤버 포인터 값은 false로 변환됩니다. 다른 값은 true로 변환됩니다. 직접 초기화 (8.5)의 경우, std :: nullptr_t 유형의 prvalue를 bool 유형의 prvalue로 변환 할 수 있습니다. 결과 값은 false입니다.
또한 이 초안 문서에서 정수 유형으로의 변환 이 언급 된 유일한 위치 std::nullptr_t
는 "reinterpret_cast"섹션에 있습니다.
5.2.10 재 해석 캐스트
...
(4) 포인터는 그것을 잡을 수있을 정도로 큰 일체형으로 명시 적으로 변환 될 수 있습니다. 매핑 함수는 구현 정의되어 있습니다. [참고 : 기본 시스템의 주소 구조를 알고있는 사람들에게는 놀라지 않을 것입니다. — 종료 참고] std :: nullptr_t 유형의 값을 정수 유형으로 변환 할 수 있습니다. 변환은 (void *) 0을 정수 유형으로 변환하는 것과 동일한 의미와 유효성을 갖습니다. [참고 : reinterpret_cast를 사용하여 모든 유형의 값을 std :: nullptr_t 유형으로 변환 할 수 없습니다. — 끝 참고]
따라서이 두 가지 관찰에서 (IMHO) 컴파일러가 올바르다 고 합리적으로 추측 할 수 MSVC
있습니다.
편집 : 그러나 "기능 표기법 캐스트"를 사용하면 실제로 반대가 될 수 있습니다! MSVC
컴파일러는 예를 들면, C 스타일 캐스트를 사용하여 문제가 없습니다 :
uintptr_t answer = (uintptr_t)(nullptr);
그러나 (코드에서와 같이) 이것에 대해 불평합니다.
uintptr_t answer = uintptr_t(nullptr); // error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'uintptr_t'
그러나 동일한 표준 초안에서 :
5.2.3 명시 적 형식 변환 (함수 표기법)
(1) 단순 형식 지정자 (7.1.6.2) 또는 형식 이름 지정자 (14.6) 다음에 괄호로 묶은 expression-list는 식 목록이 지정된 경우 지정된 형식의 값을 구성합니다. 표현식 목록이 단일 표현식 인 경우 유형 변환 표현식은 해당 캐스트 표현식 (5.4)과 동일합니다 (정의 된 의미로 정의 된 경우). ...
"해당 캐스트 표현식 (5.4)"은 C 스타일 캐스트를 나타낼 수 있습니다.