क्या नया (यह) ThisClass () एक बुरा विचार है?


9
class FooView final : public Something
{
    ...
    void refresh()
    {
        this->~FooView();
        new (this) FooView();
    }
}

मैंने इस मुहावरे को कभी नहीं देखा है, और ऐसा लगता है कि यह वास्तव में सूक्ष्म और गड़बड़ हो सकता है, लेकिन मैं वास्तव में इसके साथ एक समस्या के बारे में नहीं सोच सकता (जब तक कि FooViewअंतिम है)। क्या यह एक बुरा विचार है?


संबंधित / डुबकी: stackoverflow.com/questions/58274963/… । क्या हम प्रकार का पूरा संदर्भ प्राप्त कर सकते हैं? कोई फर्क नहीं पड़ता।
नेथनऑलिवर

जवाबों:


12

आप ऐसा कर सकते हैं, लेकिन आपको इसके लिए मेमोरी लॉन्ड्रिंग की आवश्यकता होगी यदि आपके पास संदर्भ या कास्ट सदस्य हैं, या यदि वर्ग का प्रकार बदलता है।

इस पर विचार करो:

struct FooView {
    const int val;

    void refresh()
    {
        this->~FooView();
        new (this) FooView{5};
    }
}

int main() {
    FooView fv{9};

    std::cout << fv.val; // surely 9!
    fv.refresh();
    std::cout << fv.val; // hmm... val is a const object, so it's 9 still?
}

इस अपरिभाषित व्यवहार से बचने के लिए, आपको मेमोरी का उपयोग करना चाहिए std::launder। संकलक यह मान लेगा कि जीवनकाल को fvछोड़कर कुछ भी प्रभावित नहीं होगा }। लॉन्ड्रिंग कंपाइलर को मान लेगा कि कोई वस्तु है, जो असंबंधित है fv:

int main() {
    FooView fv{9};

    std::cout << fv.val; // surely 9!
    fv.refresh();
    std::cout << std::launder(&fv)->val; // yay, 5
}

अब यह एक अच्छा विचार है? मैं इसके खिलाफ सलाह दूंगा क्योंकि यह भ्रम पैदा कर सकता है लेकिन इसे सुरक्षित रूप से किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.