नीचे कोड पर विचार करें:अंतर्निहित रूपांतरण shared_ptr को
#include <iostream>
#include <memory>
void f(std::shared_ptr<int> sp) {}
template <typename FuncType, typename PtrType>
auto call_f(FuncType f, PtrType p) -> decltype(f(p))
{
return f(p);
}
int main()
{
f(0); // doesn't work for any other int != 0, thanks @Rupesh
// call_f(f, 0); // error, cannot convert int to shared_ptr
}
पहली पंक्ति में main()
में, पूर्णांक 0
एक std::shared_ptr<int>
में बदल जाती है और कॉल f(0)
किसी भी समस्या के बिना सफल होता है। हालांकि, फ़ंक्शन को कॉल करने के लिए टेम्पलेट का उपयोग करके चीज़ें अलग-अलग होती हैं। दूसरी पंक्ति अब और संकलन नहीं होगा, त्रुटि जा रहा है
error: could not convert 'p' from 'int' to 'std::shared_ptr<int>'
मेरे सवालों का कर रहे हैं:
- क्यों पहली कॉल सफल होने करता है और दूसरा नहीं करता है? क्या मैं यहां कुछ भी याद कर रहा हूं?
- मुझे यह समझ में नहीं आता कि
int
सेstd::shared_ptr
पर रूपांतरणf(0)
पर किया जा रहा है, क्योंकि यहstd::shared_ptr
जैसा दिखता है केवल स्पष्ट निर्माता हैं।
पुनश्च: इस उदाहरण का एक प्रकार nullptr
साथ इस तरह के कॉल की रक्षा करने के एक तरीके के रूप में, स्कॉट Meyers 'प्रभावी आधुनिक सी ++ आइटम 8 में दिखाई देता है।
@@ vsoftco आप का उल्लेख करना चाहिए कि यह केवल 'च (0)', के अलावा कुछ भी नहीं है शून्य से संकलन है, अन्य के लिए एक ही त्रुटि के लिए काम कर रहा है:
मजेदार बात यह है कि यहां तक कि इस कोड काम करता है, है पहले कॉल में मूल्य भी। –
[यह] (http://en.cppreference.com/w/cpp/language/nullptr) एक स्पष्टीकरण पर संकेत देता है - "किसी भी सूचक प्रकार के नलप्टर से शून्य सूचक मूल्य और सदस्य प्रकार के किसी भी सूचक से निहित रूपांतरण मौजूद हैं। इसी तरह के रूपांतरण किसी भी प्रकार के std :: nullptr_t के साथ-साथ मैक्रो न्यूल, शून्य सूचक स्थिर के लिए मौजूद हैं। " लेकिन यह देखना दिलचस्प होगा कि यह मानक संदर्भों और अधिक स्पष्टता के साथ समझाया गया है। – Pradhan
@RupeshYadav। किया हुआ। दरअसल, यह बहुत अजीब है, ऐसा लगता है कि किसी प्रकार का निहित सूचक रूपांतरण किया जा रहा है। – vsoftco