2014-11-10 16 views
9

सी ++ 11 मानक को देखते हुए। मैं देख सकता हूं कि std::tuple_size और std::tuple_element का विशेषज्ञता volatile और const volatile टुपल के लिए प्रदान किया गया है।अस्थिर और कॉन्स अस्थिर std :: tuple और std ::

template <size_t I, class T> class tuple_element<I, volatile T>; 
template <size_t I, class T> class tuple_element<I, const volatile T>; 

template <class T> class tuple_size<volatile T>; 
template <class T> class tuple_size<const volatile T>; 

लेकिन std::get के लिए volatile या const volatile टपल कोई प्रस्ताव विशेषज्ञता है।

मैं GCC.4.8.1 पर निम्नलिखित कोड की कोशिश की

volatile std::tuple<int, int> a(1, 1); 
std::cout << "a<0>=" << std::get<0>(a) << "\n"; 

मैं त्रुटि: no matching function for call to 'get(volatile std::tuple<int, int>&)'

तो अगर मैं समझता हूँ कि मैं (स्थिरांक) अस्थिर tuples बना सकते हैं, लेकिन मैं उनके तत्वों उपयोग नहीं कर सकते ।

क्या यह एक अपेक्षित व्यवहार या पर्यवेक्षण है?

बहुत बहुत धन्यवाद।

+0

जीसीसी 4.9 या तो काम नहीं करता है, fwiw। – Barry

+0

'कॉन्स्ट अस्थिर' मुझे एक अजीब संयोजन के रूप में मारता है। किसी को इसका वैध उपयोग पता है? – Cameron

+3

@ कैमरॉन हार्डवेयर रजिस्ट्रार जिन्हें लिखा नहीं जाना चाहिए लेकिन उदाहरण के लिए, आपके तहत बदला जा सकता है। –

उत्तर

4

यह केवल std::get के लिए मामला नहीं है बल्कि relational operators या swap के लिए भी है। swap क्यों अस्थिर tuples का समर्थन नहीं करता है? क्योंकि tuple के move constructor अस्थिर tuples लेता है। assignment operator के लिए ही चला जाता है। असल में, मानक पुस्तकालय को पूरी तरह से देखते समय, लगभग कोई कक्षा या टेम्पलेट अस्थिर वस्तुओं के लिए अधिभार प्रदान करता है। शायद यह मानकीकरण और कार्यान्वयन में एक परेशानी होगी; या शायद यह अस्थिर वर्ग वस्तुओं के लिए बकवास माना जाता है। किसी भी मामले में, अस्थिर tuples वर्तमान में काफी अनुपयोगी हैं और उनके लिए get अधिभार जोड़ना होगा, इंटरफेस की वर्तमान स्थिति के संबंध में, असंगत हो।

volatile tupleप्रकार (और कोई वस्तु नहीं) के रूप में समस्याग्रस्त नहीं है और उपयोगी हो सकता है। यह, और तथ्य यह है कि मानक पुस्तकालय में हर एक अन्य प्रकार की विशेषता भी सभी सीवी-क्वालीफायरों के लिए विशिष्ट है, जिससे tuple_element और tuple_size इसका समर्थन करता है।


एक आसानी से पर खंड 17 से सी ++ मानक में volatile की खोज करके यह देख सकते हैं। एक को पता चलेगा कि क्लॉज 29 में परमाणुओं के अलावा किसी भी फ़ंक्शन (टेम्पलेट) को अस्थिर पैरामीटर के लिए ओवरलोड किया गया है।

संबंधित मुद्दे