2015-03-14 8 views
7

क्या ऐसे बयान मानक द्वारा मान्य हैं? *it रिटर्न '1' -घटाना शुरू करें() पुनरावर्तक और फिर इसे फिर से बढ़ाना

std::string str{"123"}; 
auto it = str.begin(); 
--it; 
++it; // Does *it point to character '1' now? 

मैं ++ जी पर 4.7.2 और बजना ++ 3.5 यह कोशिश की है। क्या यह सी ++ 11 में मानक व्यवहार है?

+2

डीबग चेक का प्रयास करें: http://coliru.stacked-crooked.com/a/3c72499373b8d2fb – dyp

उत्तर

13

नहीं, यह मान्य नहीं है।

24.2.6 [बिडरेक्शनल.इटरेटर्स] के रूप में यह अनिर्धारित व्यवहार है कि --it का पोस्टकंडीशन यह है कि परिणाम अव्यवस्थित होना चाहिए। चूंकि यह आपके उदाहरण में begin() से पहले इंगित करता है, यह स्थिति पूरी नहीं हुई है और इसलिए कोड अवैध है।

चूंकि कोई डायग्नोस्टिक आवश्यक नहीं है, तो काम करने लगते हैं, लेकिन आप इस पर भरोसा नहीं कर सकते (और नहीं)।

+0

क्या तर्क दूसरे तरीके से नहीं होना चाहिए? * Pre * स्थिति को पूरा नहीं किया गया है क्योंकि 'r = start()' से पहले 'r == ++ s'' नहीं है। इसलिए, ऑपरेशन की अनुमति नहीं है। – 5gon12eder

+0

@ 5gon12eder इसे देखने और इसके बारे में तर्क करने के कई तरीके हैं। मैंने पोस्टकंडिशन का उपयोग किया क्योंकि यह मेरे लिए सबसे स्पष्ट प्रतीत होता है, इस विचार के साथ कि यदि आप एक पुनरावर्तक को कम करते हैं, तो यह अभी भी एक वैध स्थान को इंगित करना चाहिए। YMMV। –

+0

@ 5gon12eder: या तो कारण अभिव्यक्ति को अपरिभाषित व्यवहार में डालता है। यह भी ध्यान रखें कि कच्चे पॉइंटर्स के लिए भी '--' का व्यवहार अनिर्धारित है यदि सूचक एक सरणी के पहले तत्व को इंगित करता है या उस ऑब्जेक्ट को जो किसी सरणी का तत्व नहीं है। –

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