मैं पिछले कुछ दिनों से सी ++ 11 के साथ खेल रहा हूं, और मैं कुछ अजीब के साथ आया था।क्यों 'std :: vector <int> b {2};' एक 1-तत्व वेक्टर बनाएं, न कि 2-तत्व वाला एक?
अगर मैं समान रूप से एक पूर्णांक को प्रारंभ करना चाहते हैं:
int a{5};
लेकिन अगर मैं :: वेक्टर एक एसटीडी करने के लिए एक ही बात करते हैं:
std::vector<int> b{2};
, एक दो तत्व सरणी का निर्माण नहीं करता है, लेकिन मूल्य दो के एक तत्व के साथ एक सरणी। ऐसा नहीं है कि प्रभाव भी इसके बारे में और अधिक स्पष्ट करने की आवश्यकता होगी प्राप्त करना चाहते लगता है:
std::vector<int> c{{2}};
std::vector<int> d = {2};
लेकिन ख की घोषणा की तरह नहीं है - यह असंगत लगता है। मैंने कुछ अन्य सामानों को एक ही प्रभाव में देखा है। मैं क्या पूछ रहा हूं - क्या यह व्यवहार अंतिम सी ++ 11 मानक में है, या यह सिर्फ एक मसौदे में है जिसे जल्दी लागू किया गया था? यदि हां, मानकों की समिति ने इस व्यवहार को क्यों शामिल किया? ऐसा लगता है कि यह वर्दी प्रारंभिकरण के पूरे उद्देश्य को हरा देता है, क्योंकि किसी को याद रखना होगा कि कौन से वर्गों में प्रारंभकर्ता सूची निर्माता हैं, और उन वर्गों के साथ {} के बजाय पुराने() वाक्यविन्यास का उपयोग करना है। या एक वर्दी प्रारंभिक रूप से पूरी तरह से गुजरता है।
यह एक बड़ा "गोचा" जैसा लगता है। लेकिन इसके लिए फायदे हो सकते हैं जिनके बारे में मुझे जानकारी नहीं है।
संपादित करें: इस कोड:
#include <iostream>
#include <vector>
int main() {
std::vector<int> a{2};
for (auto x: a) {
std::cout << x << std::endl;
}
return 0;
}
आउटपुट "2" जीसीसी 4.6.2
@ildjarn: मैं इसे जीसीसी पर पुष्टि कर सकता हूं, और चूंकि इसकी प्रारंभिक सूची सीटीओआर है, ऐसा लगता है कि यह सही काम है। – PlasmaHH
ध्यान दें कि वर्दी प्रारंभिक (झूठा) वादा का मतलब यह नहीं है कि आप हर जगह {} द्वारा प्रतिस्थापित कर सकते हैं, बस, कि अब आप बहुत अधिक स्थानों पर {} का उपयोग कर सकते हैं। – PlasmaHH
मैं सी ++ 11 विशेषज्ञ नहीं हूं, लेकिन मैंने बस एक प्रशिक्षण कक्षा ली है, और यह मेरे लिए सही लग रहा है। – Almo