जब हम रचनाकारों की गणना कर रहे हैं और उनकी व्यवहार्यता की जांच करते हैं - यानी चालक कन्स्ट्रक्टर के लिए एक अंतर्निहित रूपांतरण अनुक्रम है, [dcl.init.ref]/5 अंतिम बुलेट बिंदु (5.2.2) तक गिर जाता है, जिसे मूल मुद्दों द्वारा संशोधित किया गया था 1604 और 1571 (उस क्रम में)।
इन प्रस्तावों की लब्बोलुआब यह है कि
हैं T1
या T2
एक वर्ग प्रकार है और T1
नहीं T2
को संदर्भ से संबंधित है, उपयोगकर्ता के निर्धारित रूपांतरण कॉपी-आरंभीकरण के लिए नियमों का उपयोग पर विचार कर रहे हैं उपयोगकर्ता की परिभाषित रूपांतरण (8.6, 13.3.1.4, 13.3.1.5) द्वारा "सीवी 1T1
" की वस्तु का एक वस्तु कार्यक्रम गैर-गठित होता है यदि संबंधित गैर-संदर्भ प्रति-प्रारंभिकता खराब हो जाएगी। गैर-संदर्भ प्रति-प्रारंभिकरण के लिए वर्णित रूपांतरण फ़ंक्शन पर कॉल का परिणाम, फिर संदर्भ को प्रत्यक्ष-प्रारंभ करने के लिए उपयोग किया जाता है।
पहला भाग केवल रूपांतरण ऑपरेटर का चयन करने का कारण बनता है। तो, बोल्डफैस्ड भाग के अनुसार, हम Y&&
को प्रत्यक्ष-प्रारंभ करने के लिए const Y
का उपयोग करते हैं।
हैं T1
संदर्भ से संबंधित T2
के लिए है:: फिर, हम पिछले बुलेट बिंदु है, जो विफल रहता है (5.2.2.3) की वजह से जब तक के माध्यम से गिर
- CV1 रूप में एक ही सीवी-योग्यता होगी , या सीवी 2 से अधिक सीवी-योग्यता; और
हालांकि, यह अब हमारे मूल अधिभार रिज़ॉल्यूशन से संबंधित नहीं है, जो केवल यह देखता है कि रूपांतरण ऑपरेटर का संदर्भ संदर्भित करने के लिए उपयोग किया जाएगा। आपके उदाहरण में, ओवरलोड रिज़ॉल्यूशन चालक का चयन करता है क्योंकि [over.ics.rank]/(3.2.5), और उसके बाद उपरोक्त पैराग्राफ प्रोग्राम को खराब बना देता है। यह एक दोष है और core issue 2077 के रूप में दायर किया गया है। एक समझदार समाधान ओवरलोड रिज़ॉल्यूशन के दौरान चाल कन्स्ट्रक्टर को त्याग देगा।
यह सब आपके फिक्सेस पर समझदार wrt बनाता है: const
को हटाने से गिरावट आती है क्योंकि प्रकार अब संदर्भ-संगत हैं, और चालक कन्स्ट्रक्टर को हटाने से कॉपी कन्स्ट्रक्टर छोड़ देता है, जिसमें एक कॉन्स्ट रेफरेंस होता है (यानी काम करता है)। अंत में, जब हम Y y = x;
लिखते हैं, [dcl.init]/(17.6.2) के बजाय, (17.6.3) लागू होता है;
अन्यथा (यानी, शेष प्रति-प्रारंभिक मामलों के लिए), उपयोगकर्ता द्वारा परिभाषित रूपांतरण अनुक्रम जो स्रोत प्रकार से गंतव्य प्रकार में परिवर्तित हो सकते हैं या (जब एक रूपांतरण फ़ंक्शन का उपयोग किया जाता है) उसके व्युत्पन्न वर्ग में होते हैं जैसा कि 13.3.1.4 में वर्णित है, और सबसे अच्छा अधिभार संकल्प (13.3) के माध्यम से चुना जाता है। [...]। कॉल का उपयोग उपर्युक्त नियमों के अनुसार प्रत्यक्ष-प्रारंभ करने के लिए किया जाता है, ऑब्जेक्ट जो प्रति-प्रारंभिकता का गंतव्य है।
आईई।प्रारंभिकरण प्रभावी रूप से Y y(x.operator const Y());
जैसा ही होता है, जो सफल होता है, क्योंकि चालक कन्स्ट्रक्टर व्यवहार्य नहीं है (Y&& y = const Y
उथल-पुथल में विफल रहता है) और कॉपी कन्स्ट्रक्टर का चयन किया जाता है।
इसके अलावा आप 'वाई (कॉन्स वाई &&);' – alexolut
कर सकते हैं यह दिखाने के लिए अच्छा होगा कि अस्वीकृति संदेश –