나는 나의 변수이 휘발성 변수의 주소가 항상 1 인 이유는 무엇입니까?
volatile int clock;
cout << &clock;
의 주소를 검사하고 싶어하지만 항상 x는 내가 뭔가 잘못하고 주소 1. 암에 있다고 말한다 ??
나는 나의 변수이 휘발성 변수의 주소가 항상 1 인 이유는 무엇입니까?
volatile int clock;
cout << &clock;
의 주소를 검사하고 싶어하지만 항상 x는 내가 뭔가 잘못하고 주소 1. 암에 있다고 말한다 ??
iostream은 void *
에 대한 대부분의 포인터를 표시하기 위해 표시하지만 volatile
포인터에 대해서는 변환이 없습니다. C++은 암시 적 캐스트 bool
으로 캐스트됩니다. (이 const
제거되지 않습니다 중 하나)
std::cout << (void*)&clock;
변환이 자동으로 작동한다고 생각합니까? –
예, 자동 변환이 있습니다. C++은 자동적으로 포인터에 대해 void *로 변환되지 않으므로 (C++에서는 명시 적 형 변환이 필요함) – bdonlan
오! 요하네스도 인간입니다! –
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
글자 그대로 1 초에 나를 이길, urg :(.에 추가하려면 : bdonlan에 의해 제안 된 솔루션에서, c 스타일은'const_cast'로 캐스팅됩니다. 인쇄의 목적을 위해, 그것은 정말로 걱정거리가 아닙니다. – GManNickG
이입니다. T
을 참조 const T
를 참조하여, 참조 마찬가지로 C++ 표준에 따라
, volatile T
어떤 유형 T
포인터 T
에 포인터 const T
, 그리고 포인터
는 별개의 변수 타입을 고려
volatile T
. 이렇게 출력 같은 객체 시도
Operator <<
has no overload for pointers to non-static member, 휘발성, 또는 함수 포인터에 대한 포인터, bool
까지 암시 적 변환을 호출한다.
* 1 *는 항상 숫자 값을 나타내는 것은 아니며 논리적 인 것도 가능합니다. – Kris