के बीच प्रारंभकर्ता_सूची अंतर मैं समझने की कोशिश कर रहा हूं कि सी ++ 11 का सही व्यवहार प्रारंभिक सूचियों और const auto
के संयोजन के दौरान होना चाहिए। मैं निम्नलिखित कोड के लिए जीसीसी और बजना के बीच अलग व्यवहार हो रही है और पता करने के लिए जो सही एक है चाहते हैं:कॉन्स ऑटो std :: क्लैंग और जीसीसी
#include <iostream>
#include <typeinfo>
#include <vector>
int main()
{
const std::initializer_list<int> l1 = { 1, 2, 3 };
const auto l2 = { 1, 2, 3 };
std::cout << "explicit: " << typeid(l1).name() << std::endl;
std::cout << "auto: " << typeid(l2).name() << std::endl;
}
जी के साथ ++ उत्पादन संकलित है:
explicit: St16initializer_listIiE
auto: St16initializer_listIKiE
जबकि बजना ++ संकलित संस्करण पैदा करता है:
explicit: St16initializer_listIiE
auto: St16initializer_listIiE
ऐसा नहीं है कि जीसीसी एक std::initializer_list<const int>
में auto
लाइन घूम रहा है, जबकि बजनापैदा करता है लगता है। जब मैं इसे std::vector
प्रारंभ करने के लिए उपयोग करता हूं तो जीसीसी संस्करण समस्या उत्पन्न करता है। तो निम्नलिखित क्लैंग के तहत काम करता है लेकिन जीसीसी के लिए एक कंपाइलर त्रुटि उत्पन्न करता है।
// Compiles under clang but fails for GCC because l4
std::vector<int> v2 { l2 };
जीसीसी सही संस्करण का निर्माण किया जाता है तो यह पता चलता है कि विभिन्न एसटीएल कंटेनर इन मामलों के लिए एक और सूची प्रारंभकर्ता अधिभार शामिल करने के लिए विस्तार किया जाना चाहिए लगता है।
नोट: यह व्यवहार जीसीसी (4.8, 4.9, 5.2) और क्लैंग (3.4 और 3.6) के कई संस्करणों में सुसंगत प्रतीत होता है।
क्या आप 'std :: vector v2 (l2.begin(), l2.end()) देख सकते हैं; '(इसे काम करना चाहिए) इसे ध्यान में रखते हुए, शायद किसी भी प्रकार की प्रारंभिक सूची सूचियों को स्पष्ट रूप से परिवर्तित किया जाना चाहिए, यहां तक कि अगर कटौती में परिवर्तन होता है। दूसरी तरफ, इसके परिणामस्वरूप प्रारंभकर्ता सूची कन्स्ट्रक्टर अन्य रचनाकारों को अक्सर छुपा सकता है। –
हां 'std :: वेक्टर v2 (l2.begin(), l2.end()); वास्तव में काम करता है। –
daveraja