मैं अपने आप को सी ++ 11 अधिक से अधिक हाल ही में उपयोग करते हुए पाते हैं, और मैं कहाँ होगा अतीत में iterators का उपयोग किया गया है, अब मैं range-based for loops उपयोग कर रहा हूँ कि जब भी संभव:मूल प्रकारों पर पुनरावृत्ति करते समय कॉन्स्ट संदर्भ का उपयोग करने का कोई नुकसान?
std::vector<int> coll(10);
std::generate(coll.begin(), coll.end(), []() { return rand(); });
सी ++ 03:
for (std::vector<int>::const_iterator it = coll.begin(); it != coll.end(); ++it) {
foo_func(*it);
}
सी ++ 11:
for (auto e : coll) { foo_func(e); }
लेकिन क्या होगा अगर संग्रह तत्व प्रकार टेम्पलेट पैरामीटर है?
foo_func(const BigType& e) { ... };
foo_func(int e) { ... };
मैं हार नहीं मानी इतना सोचा जब मैं सी ++ 03 उपयोग कर रहा था: foo_func()
शायद मूल्य द्वारा स्थिरांक संदर्भ द्वारा जटिल (= कॉपी करने के लिए महंगा) प्रकार, और सरल लोगों पारित करने के लिए अतिभारित हो जाएगा उपरोक्त स्टाइल कोड। मैं वही तरीके से पुन: प्रयास करूंगा, और चूंकि कॉन्स्ट_इटरेटर को संदर्भित करने से एक कॉन्स्ट संदर्भ उत्पन्न होता है, सबकुछ ठीक था। लेकिन सी ++ 11 रेंज आधारित पाश के लिए, मैं एक ही व्यवहार प्राप्त करने के लिए एक स्थिरांक संदर्भ पाश चर का उपयोग करने की आवश्यकता का उपयोग कर:
for (const auto& e : coll) { foo_func(e); }
, अगर यह परिचय नहीं होता और अब अचानक मुझे यकीन है कि नहीं था अनावश्यक असेंबली निर्देश अगर auto
एक साधारण प्रकार था (जैसे संदर्भ को लागू करने के लिए पीछे के दृश्य सूचक)।
लेकिन एक नमूना अनुप्रयोग संकलन ने पुष्टि की कि सरल प्रकारों के लिए कोई ओवरहेड नहीं है, और यह टेम्पलेट्स में लूप के लिए श्रेणी-आधारित का उपयोग करने का सामान्य तरीका प्रतीत होता है। यदि यह मामला नहीं था, तो boost::call_traits::param_type जाने का रास्ता होता।
प्रश्न: क्या मानक में कोई गारंटी है?
(मुझे लगता है कि इस मुद्दे को वास्तव में छोरों के लिए सीमा के आधार पर करने के लिए संबंधित नहीं है। यह जब const_iterators का उपयोग कर भी मौजूद है।)
या ... केवल 'ऑटो कॉन्स्ट &'. ;) – Xeo
@Xeo का उपयोग करते हुए: यदि इटरेटर मूल्य के संदर्भ में ['const'] संदर्भ के बजाय मान प्राप्त करता है तो' T && 'संदर्भ के बजाय मान को घटाता है मूल्य। –
* हू? * 'ऑटो और 'हमेशा एक संदर्भ होगा, इससे कोई फर्क नहीं पड़ता कि इटरेटर क्या उपज करते हैं। यदि यह वास्तव में एक मूल्य पैदा करता है, तो यह केवल एक रावल्यू संदर्भ होगा। (नोट: मैंने आपकी टिप्पणी को गलत समझा होगा।) – Xeo