नहीं, वे वही नहीं हैं। explicit
उस प्रकार के निहित रूपांतरणों को अस्वीकार करता है यदि उस कन्स्ट्रक्टर का चयन किया गया है - तर्कों में अंतर्निहित रूपांतरण कोई फर्क नहीं पड़ता। delete
किसी भी निर्माण को अस्वीकार करता है अगर उस कन्स्ट्रक्टर का चयन किया जाता है, और इसका उपयोग अंतर्निहित तर्क रूपांतरण को अस्वीकार करने के लिए किया जा सकता है।
उदाहरण के लिए
तो:
struct X {
explicit X(int) { }
};
void foo(X) { }
foo(4); // error, because X's constructor is explicit
foo(X{3}); // ok
foo(X{'3'}); // ok, this conversion is fine
delete
से कि अलग है एक निर्माता ing:
struct Y {
Y(int) { }
Y(char) = delete;
};
void bar(Y) { }
bar(4); // ok, implicit conversion to Y since this constructor isn't explicit
bar('4'); // error, this constructor is deleted
bar(Y{'4'}); // error, doesn't matter that we're explicit
दो तकनीकों भी ओर्थोगोनल हैं। यदि आप चाहते हैं एक प्रकार परोक्ष-परिवर्तनीय और वास्तव में एक int
से केवल constructible नहीं हो, तो आप दोनों कर सकते हैं:
struct W {
explicit W(int) { }
template <class T>
W(T) = delete;
};
void quux(W);
quux(4); // error, constructor is explicit
quux('4'); // error, constructor is deleted
quux(4L); // error, constructor is deleted
quux(W{'4'}); // error, constructor is deleted
quux(W{5}); // ok
नोट, जो स्पष्ट कन्स्ट्रक्टर, और प्रतिलिपि/चालक कन्स्ट्रक्टर को भी कॉल करता है। 'जेड जेड (1 एलएल); 'केवल स्पष्ट कन्स्ट्रक्टर को कॉल करेगा। – immibis