2011-11-23 3 views

답변

18

iostream은 void *에 대한 대부분의 포인터를 표시하기 위해 표시하지만 volatile 포인터에 대해서는 변환이 없습니다. C++은 암시 적 캐스트 bool으로 캐스트됩니다. (이 const 제거되지 않습니다 중 하나)

std::cout << (void*)&clock; 
+0

변환이 자동으로 작동한다고 생각합니까? –

+0

예, 자동 변환이 있습니다. C++은 자동적으로 포인터에 대해 void *로 변환되지 않으므로 (C++에서는 명시 적 형 변환이 필요함) – bdonlan

+7

오! 요하네스도 인간입니다! –

17

const void*에 대한 operator<<있다, 그러나 volatile void*에 대한 operator<<가 없습니다, 그리고 암시 적 변환은 volatile 제거되지 않습니다 : 당신이 주소를 인쇄하려면 명시 적으로 void*에 캐스팅.

GMan이 말했듯이 지적 된 유형의 cv 자격은 주소를 인쇄하는 업무와 관련이 없어야합니다. 아마도 27.7.3.6.2에 정의 된 과부하가 operator<<(const volatile void* val);이어야합니다. 단점은 즉시 볼 수 없습니다. 그러나 그렇지 않습니다.

#include <iostream> 

void foo(const void *a) { 
    std::cout << "pointer\n"; 
} 

void foo(bool a) { 
    std::cout << "bool\n"; 
} 

int main() { 
    volatile int x; 
    foo(&x); 
    std::cout << &x << "\n"; 
    int y; 
    foo(&y); 
    std::cout << &y << "\n"; 
    void foo(volatile void*); 
    foo(&x); 
} 

void foo(volatile void *a) { 
    std::cout << "now it's a pointer\n"; 
} 

출력 : volatile에 대한 포인터를 취 operator <<에 대한 과부하가 없다, 그것을 충족 할 수없는 포인터 변환이 없기 때문에

bool 
1 
pointer 
0x22cd28 
now it's a pointer 
+0

글자 그대로 1 초에 나를 이길, urg :(.에 추가하려면 : bdonlan에 의해 제안 된 솔루션에서, c 스타일은'const_cast'로 캐스팅됩니다. 인쇄의 목적을 위해, 그것은 정말로 걱정거리가 아닙니다. – GManNickG

0

이입니다. T을 참조 const T를 참조하여, 참조 마찬가지로 C++ 표준에 따라

, volatile T 어떤 유형 T 포인터 T에 포인터 const T, 그리고 포인터

는 별개의 변수 타입을 고려 volatile T. 이렇게 출력 같은 객체 시도

Operator << has no overload for pointers to non-static member, 휘발성, 또는 함수 포인터에 대한 포인터, bool까지 암시 적 변환을 호출한다.

관련 문제