क्लैंग 3.5.0 और जीसीसी 4.9.1 के साथ निम्न कोड संकलित अंतिम विवरण में एक त्रुटि उत्पन्न करता है। जबकि bar({1, 2})
नहीं हैब्रांडेड-इनिट-लिस्ट एक कन्स्ट्रक्टर आमंत्रण बनाम फ़ंक्शन कॉल में अलग-अलग व्यवहार क्यों करती है?
#include <iostream>
struct Foo { Foo(int x, int y) { std::cout << "Foo(int = " << x << ", int = " << y << ")" << std::endl; } };
void bar(int x, int y) { std::cout << "bar(int = " << x << ", int = " << y << ")" << std::endl; }
int main()
{
Foo({}, {}); // Foo(int = 0, int = 0)
Foo({1}, {2}); // Foo(int = 1, int = 2)
Foo({1, 2}); // Foo(int = 1, int = 2)
bar({}, {}); // bar(int = 0, int = 0)
bar({1}, {2}); // bar(int = 1, int = 2)
bar({1, 2}); // error: no matching function for call to 'bar' <<< Why? <<<
}
क्यों Foo({1, 2})
ठीक है?
विशेष रूप से, तर्क के बारे में जानना बहुत अच्छा होगा।
मेरा अनुमान है, 'फू ({1,2})' एक अस्थायी फू वस्तु बनाता है और प्रति ctor कॉल । – Borgleader
@ बॉर्गलीडर धन्यवाद, यह समझ में आता है! :-) – precarious
@ बोर्गलीडर द्वारा टिप्पणी सही है - {1, 2} के साथ आप एक अस्थायी फू ऑब्जेक्ट बना सकते हैं, लेकिन केवल जब फू की अपेक्षा की जाती है। आप वास्तव में इसके साथ काम करने के लिए एकाधिक पैरामीटर पारित नहीं कर सकते हैं। –