क्यों नीचे दिए गए उदाहरण कोड में, ऑब्जेक्ट दो बार कॉपी किया गया है? थ्रेड क्लास के प्रलेखन कन्स्ट्रक्टर के अनुसार थ्रेड-लोकल स्टोरेज के सभी तर्कों की प्रतिलिपि बनाई गई है, इसलिए हमारे पास पहली प्रतिलिपि का कारण है। दूसरे के बारे में क्या? ऊपर सेstd :: धागा ऑब्जेक्ट दो बार कॉपी क्यों किया जाता है?
class A {
public:
A() {cout << "[C]" << endl;}
~A() {cout << "[~D]" << endl;}
A(A const& src) {cout << "[COPY]" << endl;}
A& operator=(A const& src) {cout << "[=}" << endl; return *this;}
void operator()() {cout << "#" << endl;}
};
void foo()
{
A a;
thread t{a};
t.join();
}
आउटपुट:
[C]
[COPY]
[COPY]
[~D]
#
[~D]
[~D]
संपादित करें: खैर, हाँ, इस कदम निर्माता को जोड़ने के बाद:
A(A && src) {cout << "[MOVE]" << endl;}
उत्पादन इस तरह है:
[C]
[COPY]
[MOVE]
[~D]
#
[~D]
[~D]
बस थोड़ा सुधार: तर्कों को ** थ्रेड-लोकल ** स्टोरेज में कॉपी नहीं किया गया है, लेकिन नए थ्रेड के ढेर पर। थ्रेड-लोकल स्टोरेज एक पूरी तरह से अलग जानवर है; एक धागा-स्थानीय चर, अनिवार्य रूप से, प्रति थ्रेड ग्लोबल वेरिएबल, थ्रेड में किसी भी फ़ंक्शन से सुलभ, प्रत्येक थ्रेड में एक अलग प्रति के साथ। –
वास्तव में, दूसरा '[COPY]' 'MOVE]' है, लेकिन आप इसे नहीं देख सकते हैं क्योंकि आपके पास कोई चालक कन्स्ट्रक्टर लागू नहीं है। – soon
उपरोक्त मामले में, दूसरा [COPY] एक प्रति है। केवल तभी जब आप एक चालक कन्स्ट्रक्टर प्रदान करते हैं या इसे डिफ़ॉल्ट रूप से घोषित करते हैं तो आपको डिफ़ॉल्ट मिल जाता है। – Klaus