इस कोड पर विचार करें:
#include <vector>
#include <iostream>
enum class A
{
X, Y
};
struct Test
{
Test(const std::vector<double>&, const std::vector<int>& = {}, A = A::X)
{ std::cout << "vector overload" << std::endl; }
Test(const std::vector<double>&, int, A = A::X)
{ std::cout << "int overload" << std::endl; }
};
int main()
{
std::vector<double> v;
Test t1(v);
Test t2(v, {}, A::X);
}
यह प्रिंट:
vector overload
int overload
अस्पष्ट अधिभार संकल्प के कारण यह संकलन त्रुटि क्यों नहीं उत्पन्न करता है? यदि दूसरा निर्माणकर्ता हटा दिया जाता है, तो हम vector overload
दो बार मिलते हैं । कैसे / किस मेट्रिक से int
एक स्पष्ट रूप से बेहतर मैच {}
है std::vector<int>
?
कंस्ट्रक्टर के हस्ताक्षर को निश्चित रूप से और अधिक ट्रिम किया जा सकता है, लेकिन मुझे सिर्फ एक समतुल्य कोड द्वारा धोखा दिया गया है और यह सुनिश्चित करना चाहता हूं कि इस प्रश्न के लिए कुछ भी महत्वपूर्ण नहीं खो गया है।
{}
कुछ विशेष मामलों में प्रभावी ढंग से करती है, लेकिन यह आम तौर पर सही नहीं है (शुरुआत, std::vector<int> x = {};
काम करने के लिए, std::vector <int> x = 0;
नहीं करता है)। यह उतना आसान नहीं है जितना कि " {}
शून्य प्रदान करता है"।
struct A { int x = 5; }; A a = {};
किसी भी मायने में शून्य नहीं देता है, यह एक के A
साथ निर्माण करता है a.x = 5
। यह इसके विपरीत है A a = { 0 };
, जो कि a.x
0. को इनिशियलाइज़ करता है। जीरो इन-लेस नहीं है {}
, यह अंतर्निहित है कि प्रत्येक प्रकार डिफ़ॉल्ट रूप से निर्मित या वैल्यू-इनिशियलाइज़्ड कैसे होता है। यहाँ , यहाँ और यहाँ देखें ।
{}
कोड के ब्लॉक के रूप में मुख्य रूप से याद करता हूं , तो चर को 0 असाइन करता है - उदाहरण: const char x = {}; 0 पर सेट है (शून्य चार), इंट आदि के लिए समान