std::launderउपयुक्त नाम है, हालांकि केवल अगर आप जानते हैं कि यह किस लिए है। यह मेमोरी लॉन्ड्रिंग करता है ।
कागज में उदाहरण पर विचार करें:
struct X { const int n; };
union U { X x; float f; };
...
U u = {{ 1 }};
यह कथन कुल मिलाकर प्रारंभिक प्रदर्शन करता है, के Uसाथ पहले सदस्य को आरंभ करता है {1}।
क्योंकि nएक है constचर, संकलक ग्रहण करने के लिए है कि नि: शुल्क है u.x.nजाएगा हमेशा 1 हो।
यदि हम ऐसा करते हैं तो क्या होता है:
X *p = new (&u.x) X {2};
क्योंकि Xतुच्छ है, हमें इसकी जगह एक नया बनाने से पहले पुरानी वस्तु को नष्ट करने की आवश्यकता नहीं है, इसलिए यह पूरी तरह से कानूनी कोड है। नई वस्तु का nसदस्य 2 होगा।
तो बताओ ... क्या u.x.nलौटाएगा?
स्पष्ट उत्तर 2 होगा। लेकिन यह गलत है, क्योंकि संकलक को यह मानने की अनुमति है कि वास्तव में constचर (न कि केवल एक const&, लेकिन घोषित वस्तु चर const) कभी नहीं बदलेगा । लेकिन हमने इसे बदल दिया।
[basic.life] / 8 उन परिस्थितियों को बाहर निकालता है जब पुराने बनाए गए चर / बिंदुओं / संदर्भों के माध्यम से नव निर्मित वस्तु तक पहुंचना ठीक होता है। और constसदस्य होना अयोग्य कारकों में से एक है।
तो ... हम कैसे u.x.nठीक से बात कर सकते हैं ?
हमें अपनी याददाश्त बढ़ानी होगी:
assert(*std::launder(&u.x.n) == 2); //Will be true.
मनी लॉन्ड्रिंग का उपयोग लोगों को ट्रेस करने से रोकने के लिए किया जाता है जहां आपको अपना पैसा मिला था। मेमोरी लॉन्ड्रिंग का उपयोग कंपाइलर को ट्रेसिंग से रोकने के लिए किया जाता है जहां आपको अपनी वस्तु मिली थी, इस प्रकार इसे किसी भी अनुकूलन से बचने के लिए मजबूर करना जो अब लागू नहीं हो सकता है।
अयोग्य कारकों में से एक है यदि आप ऑब्जेक्ट के प्रकार को बदलते हैं। std::launderयहाँ भी मदद कर सकते हैं:
aligned_storage<sizeof(int), alignof(int)>::type data;
new(&data) int;
int *p = std::launder(reinterpret_cast<int*>(&data));
[basic.life] / 8 हमें बताता है कि, यदि आप पुराने के भंडारण में एक नई वस्तु आवंटित करते हैं, तो आप पुराने के लिए पॉइंटर्स के माध्यम से नई वस्तु तक नहीं पहुँच सकते। launderहमें उस ओर कदम बढ़ाने की अनुमति देता है।
std::launder?std::launderइसका उपयोग "एक ऑब्जेक्ट के लिए एक पॉइंटर को प्राप्त करने के लिए किया जाता है, जो एक ही प्रकार के मौजूदा ऑब्जेक्ट द्वारा कब्जा किए गए स्टोरेज में बनाया गया है, भले ही इसमें कॉन्स्टेंट या संदर्भ सदस्य हों।"