2011-11-23 9 views
20

मैं अपने चरइस अस्थिर चर का पता हमेशा 1 पर क्यों है?

volatile int clock; 
cout << &clock; 

का पता निरीक्षण करने के लिए करना चाहता था लेकिन यह हमेशा कहते हैं कि एक्स पर पता 1. Am मैं कुछ गलत कर रहा है ??

+2

* 1 * हमेशा संख्यात्मक मूल्य का प्रतिनिधित्व करने की आवश्यकता नहीं है - तर्कसंगत भी हो सकता है। – Kris

उत्तर

18

iostreams अधिकांश पॉइंटर्स को void * पर प्रदर्शित करने के लिए डालेगा - लेकिन volatile पॉइंटर्स के लिए कोई रूपांतरण मौजूद नहीं है। जैसे कि सी ++ अंतर्निहित कास्ट पर bool पर वापस आ जाता है। void* में कास्ट करें स्पष्ट रूप से अगर आप पता प्रिंट करना चाहते हैं:

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

मैंने सोचा कि रूपांतरण स्वचालित काम करता है? –

+0

हां, एक स्वचालित रूपांतरण है। यह सिर्फ यह है कि यह स्वचालित रूप से 'शून्य' में परिवर्तित हो जाता है, न कि 'शून्य *', क्योंकि सी ++ में पॉइंटर्स के लिए 'शून्य *' में स्वचालित रूपांतरण नहीं होता है (सी करता है, लेकिन सी ++ को स्पष्ट कास्ट की आवश्यकता होती है) – bdonlan

+7

ओह! जोहान्स भी इंसान है! –

17

वहाँ const void* के लिए एक operator<< है, लेकिन वहाँ volatile void* के लिए कोई operator<< है, और अंतर्निहित रूपांतरण volatile को नहीं निकाला जाएगा (यह const को दूर नहीं होगा)।

जैसा कि जीएमएन कहते हैं, इस प्रकार की सीवी-योग्यता एक पते को मुद्रित करने के व्यवसाय के लिए अप्रासंगिक होना चाहिए। शायद 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"; 
} 

आउटपुट:

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

सचमुच एक सेकंड से मुझे मारो, आग्रह करें :(।जोड़ने के लिए: बोडनान द्वारा प्रस्तावित समाधान में, सी-शैली को 'const_cast' के रूप में डाला गया। मुद्रण के उद्देश्य के लिए, यह वास्तव में एक चिंता नहीं है। – GManNickG

0

यह है कि volatile के लिए सूचक लेता operator << के लिए कोई अधिभार है वहाँ क्योंकि, और कोई सूचक रूपांतरण है कि यह पूरा कर सके है।

सी ++ मानक के अनुसार,

किसी भी प्रकार T, सूचक T करने के लिए, सूचक const T के लिए, और सूचक volatile T करने के लिए

, विशिष्ट पैरामीटर प्रकार माना जाता है के रूप में संदर्भ T के संदर्भ में, const T के संदर्भ में, और कर रहे हैं volatile T पर।

Operator << has no overload for pointers to non-static member, अस्थिर, या समारोह संकेत की ओर इशारा है, तो उत्पादन इस तरह की वस्तुओं के लिए प्रयास कर bool लिए अंतर्निहित रूपांतरण invokes।

संबंधित मुद्दे