2013-03-17 3 views
8

पर मान निर्दिष्ट करें हम std::reference_wrapper द्वारा लिपटे आइटम को मान कैसे निर्दिष्ट कर सकते हैं?एक मान को std :: context_wrapper

int a[] = {0, 1, 2, 3, 4}; 

std::vector <std::reference_wrapper<int>> v(a, a+5); 

v[0] = 1234; // Error, can not assign value ! 

त्रुटि के लिए Accoring, सीधे काम हटा दी जाती है:

error: use of deleted function 'std::reference_wrapper<_Tp>::reference_wrapper(_Tp&&) [with _Tp = int]'

उत्तर

11

get() सदस्य समारोह का उपयोग करें:

v[0].get() = 1111; // ok 

Herestd::reference_wrapper के सभी सदस्य कार्यों की एक सूची है। चूंकि एक operator= है:

reference_wrapper& operator=(const reference_wrapper<T>& other); 

पूर्णांक शाब्दिक एक संदर्भ आवरण है, जो विफल रहता है में बदल जाती है, और जैसा कि आप देख त्रुटि संदेश है।

वैकल्पिक रूप से, आप रूपांतरण ऑपरेटर को स्पष्ट (static_cast<int&>(v[0]) = 1111;) पर कॉल कर सकते हैं, लेकिन ऊपर दिखाए गए get() विधि का बेहतर उपयोग करें।

+1

बस सोच रहा है, रूपांतरण ऑपरेटर का क्या उपयोग है यदि इसका उपयोग इस तरह नहीं किया जा सकता है? मुझे 'static_cast (v [0]) = 1111; 'थोड़ा मिलता है जब' मिलता है()' है। – chris

+0

शायद यह भी जोड़ें कि 'std :: context_wrapper' का गैर-स्पष्ट कन्स्ट्रक्टर यहां महत्वपूर्ण है जो उदा। 'boost :: context_wrapper' नहीं है। – inf

+2

@ क्रिस, ऐसा इसलिए है कि आप 'टी' और '' लेते हुए एक समारोह में 'context_wrapper ' पास कर सकते हैं (मुझे लगता है कि मैं वहां भी 'get()' कह सकता हूं, लेकिन यह और अधिक verbose होगा)। –

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