मैं अपने चरइस अस्थिर चर का पता हमेशा 1 पर क्यों है?
volatile int clock;
cout << &clock;
का पता निरीक्षण करने के लिए करना चाहता था लेकिन यह हमेशा कहते हैं कि एक्स पर पता 1. Am मैं कुछ गलत कर रहा है ??
मैं अपने चरइस अस्थिर चर का पता हमेशा 1 पर क्यों है?
volatile int clock;
cout << &clock;
का पता निरीक्षण करने के लिए करना चाहता था लेकिन यह हमेशा कहते हैं कि एक्स पर पता 1. Am मैं कुछ गलत कर रहा है ??
iostreams अधिकांश पॉइंटर्स को void *
पर प्रदर्शित करने के लिए डालेगा - लेकिन volatile
पॉइंटर्स के लिए कोई रूपांतरण मौजूद नहीं है। जैसे कि सी ++ अंतर्निहित कास्ट पर bool
पर वापस आ जाता है। void*
में कास्ट करें स्पष्ट रूप से अगर आप पता प्रिंट करना चाहते हैं:
std::cout << (void*)&clock;
मैंने सोचा कि रूपांतरण स्वचालित काम करता है? –
हां, एक स्वचालित रूपांतरण है। यह सिर्फ यह है कि यह स्वचालित रूप से 'शून्य' में परिवर्तित हो जाता है, न कि 'शून्य *', क्योंकि सी ++ में पॉइंटर्स के लिए 'शून्य *' में स्वचालित रूपांतरण नहीं होता है (सी करता है, लेकिन सी ++ को स्पष्ट कास्ट की आवश्यकता होती है) – bdonlan
ओह! जोहान्स भी इंसान है! –
वहाँ 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
सचमुच एक सेकंड से मुझे मारो, आग्रह करें :(।जोड़ने के लिए: बोडनान द्वारा प्रस्तावित समाधान में, सी-शैली को 'const_cast' के रूप में डाला गया। मुद्रण के उद्देश्य के लिए, यह वास्तव में एक चिंता नहीं है। – GManNickG
यह है कि 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।
* 1 * हमेशा संख्यात्मक मूल्य का प्रतिनिधित्व करने की आवश्यकता नहीं है - तर्कसंगत भी हो सकता है। – Kris