आपके प्रतिलिपि बनाने वाले दो संदिग्ध चीजें हैं जो आपके पास हैं।
सबसे पहले, आप कॉपी-निर्माता स्पष्ट है (जो कि एक संदिग्ध बात है) के बाद, आप (सिद्धांत में) होगा क्या करने की जरूरत है ताकि:
Foo d((Foo()));
दूसरा, आपके प्रति निर्माता लेता है एक संदर्भ और const
संदर्भ नहीं है जिसका अर्थ है कि आप इसे अस्थायी Foo
के साथ उपयोग नहीं कर सकते हैं।
व्यक्तिगत रूप से, मैं कॉपी-कन्स्ट्रक्टर से explicit
हटा दूंगा और यदि संभव हो तो इसे const
संदर्भ लेगा।
ध्यान दें कि आपके डिफ़ॉल्ट कन्स्ट्रक्टर पर explicit
का कोई प्रभाव नहीं पड़ता है। [*] explicit
केवल रचनाकारों पर प्रभाव डालता है जिसे एकल पैरामीटर के साथ बुलाया जा सकता है। यह उन्हें निहित रूपांतरणों के लिए इस्तेमाल करने से रोकता है। रचनाकारों के लिए जो केवल शून्य या केवल दो या अधिक पैरामीटर लेते हैं, इसका कोई प्रभाव नहीं पड़ता है।
[नोट: के बीच एक अंतर हो सकता है:।
Foo d;
और
Foo d = Foo();
लेकिन इस मामले में आप एक उपयोगकर्ता के घोषित डिफ़ॉल्ट निर्माता तो यह लागू नहीं होता है]
संपादित करें: [*] मैंने इसे दो बार चेक किया है और 12.3.1 [class.conv.ctor] कहता है कि आप एक डिफ़ॉल्ट विपक्ष बना सकते हैं ट्रक्टर explicit
। इस मामले में कन्स्ट्रक्टर का उपयोग डिफ़ॉल्ट-प्रारंभिक या मूल्य-प्रारंभिक करने के लिए किया जाएगा।ईमानदार होने के लिए, मुझे इस बात का एहसास नहीं है कि आपके पास उपयोगकर्ता द्वारा घोषित कन्स्ट्रक्टर है, तो यह गैर-पीओडी प्रकार है और यहां तक कि गैर-पीओडी प्रकार की स्थानीय वस्तुएं डिफ़ॉल्ट-प्रारंभिक हैं यदि उनके पास प्रारंभकर्ता नहीं है जो इस खंड का कहना है explicit
डिफ़ॉल्ट कन्स्ट्रक्टर द्वारा किया जा सकता है। शायद कोई एक कोने केस इंगित कर सकता है जहां यह कोई फर्क पड़ता है लेकिन अभी के लिए मुझे नहीं लगता कि explicit
का डिफ़ॉल्ट कन्स्ट्रक्टर पर क्या प्रभाव पड़ता है।
स्रोत
2010-05-05 19:55:19
फू फू फू? है ना? –
कंपाइलर ने पहले से ही आपके प्रश्न का उत्तर दिया है ... 'फू (कॉन्स फू एंड) '। 'फू डी = फू();' कॉपी कन्स्ट्रक्टर का आह्वान कर रहा है। –
+1 क्योंकि कोई भी जवाब –