2015-06-24 12 views
5

में `std :: cbegin()` का समर्थन स्कॉट मेयर्स के "प्रभावी आधुनिक सी ++" आइटम 13 से इटरेटर पर const_iterators पसंद करते हैं। मैं सहमत हूं लेकिन मैं सदस्य कार्यों के बजाय गैर-सदस्य कार्यों का भी उपयोग करना चाहता हूं। पुस्तक के अनुसार सी ++ 14 में गैर-सदस्य फ़ंक्शन std::cbegin() और std::cend() होना चाहिए।सी ++ 14

इस फ़ंक्शंस का उपयोग करने के लिए मैंने अभी जीसीसी संस्करण 4.9.2 स्थापित किया है और ध्वज -std=c++14 के साथ संकलित किया है। ऐसा लगता है जब तक कि मैं std::cbegin() का उपयोग करने की कोशिश नहीं करता। मैं इस फ़ंक्शन के लिए समर्थन की खोज करना शुरू कर रहा हूं लेकिन इसके बारे में कुछ भी नहीं मिला। उदाहरण के लिए, gnu onlinedocs status पर फ़ंक्शन का भी उल्लेख नहीं किया गया है।

मेरा प्रश्न है, std::cbegin() और std::cend() वास्तव में C++ 14 में समर्थित होगा या यह पुस्तक में एक गलती है? यदि यह एक सी ++ 14 फीचर होगा, तो क्या ऐसे कंपाइलर्स हैं जो पहले से ही इन कार्यों का समर्थन करते हैं और जीसीसी इसका समर्थन कब करेगा?

SO के बारे में begin() पर कई प्रश्न हैं लेकिन ये प्रश्न सदस्य कार्य या कॉन्स्टेक्स-नेस के बारे में हैं और गैर-सदस्य संस्करण के समर्थन के बारे में नहीं हैं।

उत्तर

1

सी ++ 14 के लिए जीसीसी 4.9 का समर्थन प्रायोगिक और अपूर्ण है। लेकिन here, आप देख सकते हैं कि

वैश्विक कार्यों cbegin, cend, rbegin, उखड़ना, crbegin, और कंटेनरों, सरणियों और प्रारंभकर्ता सूची में सीमा पहुँच के लिए crend।

जीसीसी 5.1 में जोड़े गए थे।

2

हां, वे सी ++ 14 में हैं। उन्हें एक पेपर द्वारा library issue द्वारा जोड़ा गया था, और ऐसा लगता है कि libstdC++ का मैन्युअल पृष्ठ लाइब्रेरी समस्याओं को ट्रैक नहीं करता है।

वे जीसीसी 5.1 में लागू किए गए हैं। GCC bug 64656 देखें।

+0

यह मेरा प्रस्ताव था। केवल मैंने इसे खुद नहीं लिखा क्योंकि यह समिति के कुछ सदस्यों द्वारा मेरे बजाय लिखा जाना चाहिए। :) –

1

हां वे हैं, cppreference उन्हें begin/end के साथ वर्णन करता है।

और मानक इसे धारा 24.7 - Range access में परिभाषित करता है। मैं इसका उद्धरण नहीं दे रहा हूं क्योंकि यह टेम्पलेट फ़ंक्शन परिभाषाओं का एक समूह है जो उपर्युक्त लिंक से सहमत है।

मसौदा, जो बहुत ही अंतिम संस्करण के करीब (मैं अंतिम मसौदा, खेद के लिए नंबर याद नहीं कर सकते) होना चाहिए: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf

तथ्य की बात के रूप में, आप पर एम्बेडेड उदाहरण के साथ खेल सकते हैं cppreference, और begin और endcbegin/cend पर कॉल करें और उन्हें चलाने का प्रयास करें। gcc 4.9 शिकायतें, हालांकि gcc 5.1 पहले से ही काम करता है, साथ ही साथ clang 3.6। तो यह सिर्फ संकलक समर्थन का मामला है।

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