यह एक कठिन सवाल है, और ऐसा हो सकता है कि विजुअलस्टूडियो सही है और कमू गलत है (यह वास्तव में विश्वास करना मुश्किल लगता है)।
वचन के द्वारा मानक अगर पढ़ा शब्द, प्रतिलिपि निर्माता के संदर्भ में परिभाषित करता है कि वेक्टर निर्माता (उद्धरण देखें), और जिसका शाब्दिक अर्थ है कि वस्तु इटरेटर अपसंदर्भन द्वारा प्राप्त पहले प्रकार टी में परिवर्तित किया जाना चाहिए और तो कॉपी कन्स्ट्रक्टर कहा जाना चाहिए। इस बिंदु पर, एक स्पष्ट निर्माता के साथ कोड संकलित नहीं होना चाहिए।
दूसरी तरफ, कार्यान्वयन की उम्मीद करना उचित लगता है, दूसरी ओर, एक कन्स्ट्रक्टर को सीधे संदर्भित इटरेटर के रूप में लेने के लिए कॉल करने के लिए, जिस स्थिति में कन्स्ट्रक्टर कॉल स्पष्ट होगा और इस प्रकार कोड संकलित होना चाहिए।यह नीचे दिए गए उद्धरण में सटीक शब्द के खिलाफ जाना होगा, प्रतिलिपि निर्माता के रूप में एक निर्माता है कि प्रकार टी का एक उद्देश्य के लिए एक एकल संभवतः लगातार संदर्भ लेने के रूप में दिए गए प्रकार टी के लिए परिभाषित किया गया है
मैं सोच भी नहीं सकते किसी भी उचित तर्क को कमौ दृष्टिकोण का उपयोग न करने के लिए, और मेरा मानना है (यह केवल व्यक्तिगत राय है) यह है कि वेक्टर कन्स्ट्रक्टर की जटिलता के संबंध में मानक में शब्द को संभवतः की आवश्यकता के अनुसार समायोजित किया जाना चाहिए, केवल उपयुक्त टी कन्स्ट्रक्टर, जहां उपयुक्त(यानी, एक निर्माता जो InputIterator::value_type
(मूल्य या संभवतः निरंतर संदर्भ द्वारा), या टी प्रतिलिपि बनाकर कन्स्ट्रक्टर के रूप में परिभाषित किया जाना चाहिए, ructor टी InputIterator::value_type
से एक अंतर्निहित रूपांतरण के बाद
23.2.4.1 [lib.vector.cons]/1
जटिलता: निर्माता टेम्पलेट वेक्टर (InputIterator पहले InputIterator पिछले) बनाता है केवल एन टी की कॉपी कन्स्ट्रक्टर को कॉल करें (जहां एन के बीच की दूरी पहले और आखिरी है) और कोई पुनर्विक्रय यदि पुनरावर्तक पहले और आखिरी आगे, बिडरेक्शनल या यादृच्छिक एक्सेस श्रेणियों के हैं। यह ऑर्डर एन टी और ऑर्डर लॉग एन प्रतिलिपि के प्रतिलिपि बनाने के लिए कॉल करता है यदि वे इनपुट इनपुटर हैं।
मुझे पता है कि व्यवहार कैसे वी.एस. संकलक जब दिया चाहते हैं:
struct T1;
struct T2 {
operator T1();
};
struct T1 {
T1(T2 const &) { std::cout << "T1(T2)" << std::endl; }
};
T2::operator T1() {
std::cout << "T2::operator T1" << std::endl;
return T1(*this);
}
int main() {
std::vector<T2> v2;
v2.push_back(T2());
std::vector<T1> v1(v2.begin(), v2.end());
}
जी के साथ
++ नतीजा यह है कि T2::operator T1
नहीं बुलाया जाता है, बल्कि v1
में तत्वों में तत्वों से सीधे निर्माण कर रहे हैं v2
। मुझे लगता है कि वीएस के साथ संकलक T2::operator T1
का उपयोग v2
में प्रत्येक तत्व से टी 1 तत्व में कनवर्ट करने के लिए करेगा और फिर कॉपी कन्स्ट्रक्टर को कॉल करेगा। ऐसा क्या?
अप्रत्यक्ष रूप से यहां उत्तर दिया गया: http://stackoverflow.com/questions/1943228/implicit-constructor-conversion-works-on-explicit-vectorvector-only- कभी-कभी –
मैंने अभी उस प्रश्न + उत्तर के आधार पर एक उत्तर लिखा है, लेकिन यह वास्तव में लागू नहीं होता है, क्योंकि 'std :: vector :: iterator' एक अभिन्न प्रकार नहीं है, और भरने वाले कन्स्ट्रक्टर को कॉल नहीं किया जा रहा है। तो मैंने इसे हटा दिया। मुझे लगता है कि मैं बस इतना कह सकता हूं कि मानक किसी भी कंटेनर कन्स्ट्रक्टर में * स्पष्ट रूपांतरण * प्रतिबंधित नहीं करता है। –
Potatoswatter
वीएस 2010 बीटा कॉमौ और जीसीसी के रूप में व्यवहार करता है। –