2016-12-29 10 views
7

निम्नलिखित कार्यक्रम पर विचार करें:क्या std :: move() iterators को अमान्य करता है?

struct list_wrapper 
{ 
    std::vector<int> m_list; 
}; 

int main() 
{ 
    std::vector<int> myList { 1, 1, 2, 3, 5 }; 

    const std::vector<int>::iterator iter = myList.begin(); 

    list_wrapper wrappedList; 
    wrappedList.m_list = std::move(myList); 

    // Can I still dereference iter? 

    return 0; 
} 

std::move(myList) करने के लिए कॉल करने के बाद, iter अब wrappedList.m_list अंदर एक वैध आइटम को इंगित करता है, या ऐसा कदम कंस्ट्रक्टर्स/कार्य सभी iterators अमान्य?

+1

'std :: move' अपने दम पर कुछ नहीं करता है को शामिल किया गया। चाल असाइनमेंट निश्चित रूप से दोनों तरफ इटेटर को अमान्य करता है। – user2357112

+0

शायद यह क्यूए मदद करेगा: http://stackoverflow.com/questions/3413470/what-is-stdmove-and-when-should-it-be-used?rq=1 –

+0

@ user2357112 [वास्तव में ...] (http://eel.is/c++draft/container.requirements.general#12) (प्रासंगिक पैराग्राफ n3337 में समान है, बस [कंटेनर.रेक्वायरमेंट्स.general]/11 पर 12)। – jaggedSpire

उत्तर

0

नहीं, उन्हें एक चालन ऑपरेशन के बाद अवैध नहीं किया जाना चाहिए।

23.3.6.5/1

सभी iterators और सम्मिलन के बिंदु से पहले संदर्भ, अप्रभावित रहते हैं जब तक कि नए कंटेनर आकार पिछले क्षमता से अधिक है (इस स्थिति में सभी iterators और संदर्भ अवैध कर रहे हैं)

4

http://en.cppreference.com के बाद नोट (जोर मेरा):

कंटेनर चाल काम (अधिभार (2)), जब तक ELEM के बाद entwise चाल काम असंगत allocators, संदर्भ, संकेत दिए गए, और iterators (अंत इटरेटर के अलावा अन्य) दूसरे के द्वारा मजबूर किया जाता है वैध बने हुए हैं, लेकिन तत्वों कि * इस में अब कर रहे हैं का संदर्भ लें। वर्तमान मानक में कंबल बयान के माध्यम से इस गारंटी नहीं देता §23.2.1 [container.requirements.general]/12, और अधिक प्रत्यक्ष गारंटी LWG 2321

नोट्स के माध्यम से विचाराधीन है

जैसा कि एचवीडी ने सही ढंग से इंगित किया है कि कम से कम एक बार ऐसा होता है जहां चालक असाइनेंट को इटरेटर्स को अमान्य करने के लिए मजबूर किया जाता है - जब नए कंटेनर में असंगत आवंटक होता है।

बेन वोइट के रूप में उल्लेख किया है कि वहाँ इस विषय over here में एक व्यापक चर्चा है और यह वास्तव में पहले से ही C++ प्रश्न के 11 पहलुओं ...

+4

यह सही है ओपी के कोड के लिए बोल्डिंग, लेकिन सामान्य प्रश्न के लिए भी "ध्यान दें कि जब तक तत्ववार चाल असाइनमेंट असंगत आवंटकों द्वारा मजबूर नहीं किया जाता है": ऐसे मामले हैं जहां चालक को असाइनमेंट द्वारा अमान्य कर दिया जाता है। – hvd

+1

क्या आप यह जवाब http://stackoverflow.com/questions/11021764/does-moving-a-vector-invalidate-iterators?rq=1 पर जोड़ सकते हैं –

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