यह एक वैध चेतावनी है:
:
c <<= 1;
के बराबर है
c = c << 1
और <<
के नियमों का कहना है कि ऑपरेटरों को बढ़ावा दिया जाता है और इस मामले में int
पर पदोन्नत किया जाएगा और परिणाम प्रचारित प्रकार का है। तो int
से unsigned char
पर अंत में एक रूपांतरण होगा जिसके परिणामस्वरूप एक परिवर्तित मूल्य हो सकता है।
कोड मान्य है, चेतावनी आपको बता रही है कि एक निहित रूपांतरण हो रहा है और कुछ मामलों में रूपांतरण मूल्य बदल सकता है। एक कास्ट का उपयोग चेतावनी चुप हो जाएगा। निहित रूपांतरणों के परिणाम बहुत प्रतिद्वंद्वी हो सकते हैं और कुछ मामलों में अपरिभाषित व्यवहार। gcc Wconversion wiki for some details देखें।
मैं बाहर मैन्युअल रूप से संचालन के विस्तार और static_cast
का उपयोग किए बिना चेतावनी को निकालने के लिए एक रास्ता नहीं दिख रहा है:
c = static_cast<unsigned char>(c << 1);
हम इस gcc bug report पर लंबे धागे से देख सकते हैं नहीं हर किसी को लगता है कि यह एक है इस चेतावनी के लिए उपयोगी मामला।
draft C++ standard अनुभाग 5.8
शिफ्ट ऑपरेटरों से संदर्भ के लिए:
ऑपरेंड अभिन्न या unscoped गणना प्रकार और अभिन्न प्रोन्नति का होगा प्रदर्शन कर रहे हैं। परिणाम के प्रकार को बढ़ावा दिया बाईं संकार्य का है [...]
और अनुभाग से 5.17
असाइनमेंट और मिश्रित असाइनमेंट ऑपरेटरों:
रूप E1 सेशन की अभिव्यक्ति के व्यवहार = ई 2 ई 1 = ई 1 ओप ई 2 के बराबर है, सिवाय इसके कि ई 1 केवल एक बार मूल्यांकन किया गया है। [...]
स्रोत
2015-04-22 11:47:57
यह मुझे लगता है, यह उन लोगों में से एक है, यदि आप कंपाइलर लेखकों और उपयोगकर्ताओं दोनों के लिए परिस्थितियों में "दंडित करते हैं और शापित हैं" में से एक है। एक उपयोगकर्ता के रूप में, जो आपने लिखा है वह साफ है और इच्छित उत्तर उत्पन्न करता है और आमतौर पर पूरी तरह से अपरिहार्य है। और इसे समझने में कठोर बनाने के लिए अतिरिक्त भाषाई अव्यवस्था की आवश्यकता नहीं है। एक कंपाइलर लेखक के रूप में, तकनीकी रूप से एक संकुचित रूपांतरण होता है, इसलिए चेतावनी तकनीकी रूप से सही होती है। लेकिन मैं मदद नहीं कर सकता लेकिन महसूस करता हूं कि इस संदर्भ में, या 'शॉर्ट' (जो संभवतः चेतावनी को ट्रिगर भी करता है) समेत, चेतावनी वास्तव में रचनात्मक नहीं है। –