मुझे इस कार्यक्रम में एक समस्या है:
struct A {}; Int main () {:: std :: vector & lt; :: std :: unique_ptr & lt; a & gt; & Gt; v; :: std :: cout & lt; & lt; :: std :: is_copy_constructible & lt; decltype (v) & gt; {} & lt; & lt; std :: endl ::; // decltype (v) w (v); वापसी 0; }
यह आउटपुट:
1
फिर भी, अगर मैं टिप्पणी की गई पंक्ति को अस्वीकार करता हूं, तो प्रोग्राम विफल हो जाएगा संकलन करना। क्या आपको लगता है, यह मानक में एक बग है, जो :: std :: is_copy_constructible & lt; decltype (v) & gt; {}
को सच
का मूल्यांकन करता है और जहां मानक में ? यदि value_type
कॉपी करने योग्य नहीं है, तो उदाहरण के लिए, मेटाफ़न को तय किया जाना चाहिए, या कंटेनर को कॉपी कन्स्ट्रक्टर को हटा देना चाहिए?
संपादित करें: मुझे लगता है मुझे स्पष्ट करना चाहिए कि यह क्यों है जरूरी। कहते हैं, आपके पास एक क्लास टेम्प्लेट variant
है, जिसमें एक कंटेनर क्लास टेम्पलेट शामिल है जिसे बिना कॉपी किए जाने वाले value_type
के साथ शुरू किया गया है। variant
हो सकता है SFINAE
दूर तरीके जो कि कंटेनर की प्रतिलिपि बनाते हैं और संकलन त्रुटियों से बचें, लेकिन चूंकि यह एसटीएल
से गलत सूचना प्राप्त करता है, ऐसा नहीं हो सकता । इस समस्या के परिणामस्वरूप, मुझे विशेष moving_variant
वर्ग टेम्पलेट लिखना पड़ता है, जो केवल चालें, कभी भी प्रतियां नहीं हैं, जबकि एक एकल variant होना संभव है / कोड> वर्ग टेम्पलेट।
is_copy_constructible
को के संदर्भ में परिभाषित किया गया है Is_constructible
, जो कि अगर इस तरह की अभिव्यक्ति अच्छी तरह से बनाई गई है, तो यह सही है:
टी टी (निर्माण & lt; const T & amp; & gt; ())
वेक्टर & lt; unique_ptr & gt;
के मामले में, यह अच्छी तरह से बनाई गई है, क्योंकि vector
एक उपयुक्त प्रति कन्स्ट्रक्टर घोषित करता है कंस्ट्रक्टर को तत्काल नहीं किया जा सकता क्योंकि यह एक हटाए गए फ़ंक्शन का उपयोग करता है; लेकिन ऐसे टेम्पलेट्स को तत्काल नहीं किया जाता है, जब इसका उपयोग किसी ऐसे अव्यक्त संदर्भ में किया जाता है।
Comments
Post a Comment