2015-04-07 4 views
7

cppreference शो शुरू:क्यों std :: std :: के रूप में एक ही प्रकार वापसी cbegin करता <code>std::cbegin</code> के लिए इस हस्ताक्षर

template< class C > 
constexpr auto cbegin(const C& c) -> decltype(std::begin(c)); 

यह C::const_iterator बजाय की तरह कुछ वापस नहीं करना चाहिए?

+0

मैं मानता हूं कि पृष्ठ इस पर थोड़ा स्पष्ट हो सकता है और लोगों को इसका कारण नहीं बताएगा (जैसा दिए गए उत्तरों में किया गया है)। इसके अलावा, एक स्पष्टीकरण क्यों cbegin पेश किया गया था (स्थिरता की गारंटी के लिए और पैरामीटर की स्थिरता पर भरोसा नहीं) मदद कर सकता है। – stefaanv

उत्तर

12

c एक const संदर्भ है, इसलिए std::begin(c) यह वापस आ जाएगी C::begin() रिटर्न के जो भी const अधिभार। मानक पुस्तकालय प्रकारों के लिए, यह const_iterator है। सरणी प्रकार के लिए, यह const पर एक सूचक है।

ध्यान दें कि यह अन्य, गैर मानक पुस्तकालय C परिभाषित, उपयोगकर्ता पर निर्भर करता है कि पुनरावर्तक कि आप कंटेनर के तत्वों को const पहुँच देता रिटर्न C::begin() के लिए एक const अधिभार के साथ sanely कार्यान्वित किया जा रहा।

3

std::beginiterator या const_iterator देता है, इस पर निर्भर करता है कि तर्क const है या नहीं, उदाहरण के लिए देखें http://en.cppreference.com/w/cpp/iterator/begin और एक मानक कंटेनर के लिए एक सदस्य समारोह begin की घोषणा http://en.cppreference.com/w/cpp/container/vector/begin

std::cbegin रिटर्न क्या std::begin रिटर्न (decltype के माध्यम से), इसलिए यदि आप एक const वस्तु है, const अधिभार चुना जाता है, बदल जाता है में देता है जो एक const_iterator

2

cbegin नीचे की तरह कार्यान्वित किया जाता है:

template <class C> 
auto cbegin(const C& container)->decltype(std::begin(container)) 
{ 
    return std::begin(container); // see explanation below 
} 

इसी शुरू के रूप में नीचे है।

template< class C > 
auto begin(C& c) -> decltype(c.begin()); //calling container's begin 

यह cbegin टेम्पलेट तर्क एक कंटेनर की तरह डेटा संरचना, सी का प्रतिनिधित्व करने के किसी भी प्रकार को स्वीकार करता है, और वह अपने संदर्भ-टू-स्थिरांक पैरामीटर, कंटेनर के माध्यम से इस तर्क तक पहुँचता है। यदि सी एक पारंपरिक कंटेनर प्रकार (उदा।, एक std :: वेक्टर) है, तो कंटेनर उस कंटेनर के कॉन्स संस्करण (उदाहरण के लिए, एक कॉन्स std :: वेक्टर &) का संदर्भ होगा। गैर -म्बर एक कॉन्स कंटेनर पर कार्य शुरू करें (सी ++ 11 द्वारा प्रदान किया गया) const_iterator उत्पन्न करता है, और यह इमेटरेटर यह टेम्पलेट लौटाता है।

उदाहरण के लिए, यदि मैंने वेक्टर को cbegin पर तर्क के रूप में उपयोग किया है।

std::vector<int> v1; 
std::cbegin(v1); 

अब, देखते हैं कि कैसे टेम्पलेट कटौती इस मामले में हुआ, टेम्पलेट (कक्षा सी) वेक्टर और cbegin (स्थिरांक सी & कंटेनर) के पैरामीटर const vector<int> & होने के लिए निष्कर्ष निकाला जा करने के लिए निष्कर्ष निकाला है। अब जब कंटेनर स्वयं स्थिर है, तो यह वेक्टर की शुरुआत के निरंतर संस्करण को वापस कर देगा।

iterator begin(); 
const_iterator begin() const; //This will be used . 
const_iterator cbegin() const; 
संबंधित मुद्दे