निम्नलिखित कोड में, wrapper<T>
ऑब्जेक्ट घोषित किया गया है जिसमें movable<T>
है, जहां T
एक अपूर्ण प्रकार है। movable
का विनाशक बनाया गया है ताकि इसे T
के पूर्ण ज्ञान के बिना तत्काल नहीं किया जा सके, लेकिन wrapper
का विनाशक केवल आगे घोषित किया गया है, जिसका अर्थ यह है कि ~movable()
~wrapper()
की परिभाषा के बिंदु पर तत्काल होना चाहिए।एक अस्वीकार्य कन्स्ट्रक्टर को विनाशक के तत्काल आवश्यकता क्यों होती है?
#include <utility>
template<class T>
struct movable {
movable() noexcept = default;
~movable() noexcept { (void) sizeof(T); }
movable(const movable&) noexcept = delete;
movable(movable &&) noexcept = default;
};
template<class T>
class wrapper {
public:
movable<T> m;
wrapper() noexcept = default;
wrapper(wrapper &&) noexcept = default;
~wrapper();
};
struct incomplete;
int main() {
/* extern */ wrapper<incomplete> original;
wrapper<incomplete> copy(std::move(original));
}
हालांकि, wrapper()
~movable()
का दृष्टांत करना चाहता है। मुझे लगता है कि अपवाद के मामले में, सदस्यों का विनाश संभव होना चाहिए, लेकिन movable()
और wrapper()
दोनों ही अस्वीकार्य हैं। दिलचस्प बात यह है कि चालक कन्स्ट्रक्टर ठीक काम करता है (उदाहरण कोड में extern
भाग को असम्बद्ध करने का प्रयास करें।)
इस व्यवहार का कारण क्या है, और क्या इसे रोकने के लिए कोई तरीका है?
बजना संकलन भी विफल रहता है। – interjay
एचएम, "क्लास टेम्पलेट की पूर्णता प्रोग्राम के अर्थशास्त्र को प्रभावित कर सकती है, तो" एक क्लास टेम्पलेट तत्काल है "... हो सकता है कि इसके साथ कुछ करने के लिए कुछ हो? –
यदि किसी वर्ग में कई सदस्य होते हैं, और निर्माण के दौरान प्रारंभिकरणों में से एक फेंकता है, तो पहले पूर्ण प्रारंभिक प्रारंभिक सदस्यों को संबंधित सदस्यों के विनाशकों को बुलाकर पूर्ववत करना होगा। मुझे लगता है कि आप जो देखते हैं उससे संबंधित है। – dyp