मैं merily नई अनुगामी वापसी प्रकार है, जहां मैं इस (सरलीकृत) कोड के साथ एक समस्या मारा के साथ प्रयोग किया गया थापीछे चल वापसी प्रकार, decltype और स्थिरांक सत्ता
#include <list>
class MyContainer{
std::list<int> ints;
auto begin() -> decltype(ints.begin())
{
return ints.begin();
}
auto begin() const -> decltype(ints.begin())
{
return ints.begin();
}
};
कैसे व्यर्थ इस कोड है की इस तथ्य पर ध्यान न दें । महत्वपूर्ण हिस्सा (-std=c++0x
ध्वज के साथ) संकलक जीसीसी 4.6.1 का उपयोग करते समय उत्पन्न त्रुटि है:
In member function 'std::list<int>::iterator MyContainer::begin() const':
error: could not convert '((const MyContainer*)this)->MyContainer::ints.std::list<_Tp, _Alloc>::begin [with _Tp = int, _Alloc = std::allocator<int>, std::list<_Tp, _Alloc>::const_iterator = std::_List_const_iterator<int>]()' from 'std::list<int>::const_iterator {aka std::_List_const_iterator<int>}' to 'std::list<int>::iterator {aka std::_List_iterator<int>}'
मामले में आप शामिल टेम्पलेट्स त्रुटि के प्रशंसक की नहीं कर रहे हैं, लघु कहानी है कि के शरीर में const
MyContainer::begin
का संस्करण, अभिव्यक्ति ints.begin()
std::list<int>::const_iterator
प्रकार का मान देता है (क्योंकि ints
const
ऐसे संदर्भ में है)। हालांकि, decltype(ints.begin())
प्रकार std::list<int>::iterator
, अर्थात decltype
पर ध्यान नहीं देताbegin
विधि के const
क्वालीफायर जब अभिव्यक्ति के प्रकार के निर्णय लेने से पैदा करता है। अनजाने में, परिणाम में एक संघर्ष परिणाम है।
यह मुझे जीसीसी कंपाइलर में एक बग होने लगता है। यह const
क्वालीफायर का सम्मान करने के लिए केवल decltype
के लिए समझ में आएगा और const_iterator
प्रकार का उत्पादन करेगा। क्या कोई इस बात की पुष्टि या इनकार कर सकता है (शायद यहां तक कि समझा सकता है)? शायद मैं decltype
के यांत्रिकी में कुछ दिख रहा हूं, लेकिन यह एक सुंदर सीधा परिदृश्य की तरह दिखता है।
नोट: जहां तक मैं कह सकता हूं, वही व्यवहार न केवल std::list<int>
के लिए है, लेकिन किसी भी प्रकार के सदस्य कार्यों के साथ const
-ness पर ओवरलोड किया गया है जो असंगत प्रकार लौटाता है।
जीसीसी 4.7.0 के हालिया स्नैपशॉट के साथ त्रुटि के बिना संकलित करता है। तब तक, मुझे लगता है कि आप 'ints.cbegin()' – Cubbi
से फंस गए हैं बेशक, इस तरह के एक मामूली मामले में यह गंभीर बाधा नहीं थी, लेकिन जीसीसी के लिए यह सभी गैर-मामूली मामलों (I यह भी सुनिश्चित करना चाहता था कि * मुझे * यह सही हो गया - मुझे उन सुविधाओं का उपयोग करने की कोई इच्छा नहीं है जिन्हें मैं समझ नहीं पा रहा हूं)। –