मैं इस कोडकंपाइलर सोचता है कि "ए (ए और)" एक पल के लिए रावल स्वीकार करता है?
struct A { A(); A(A&); };
struct B { B(const A&); };
void f(A);
void f(B);
int main() {
f(A());
}
मेरे आश्चर्य करने के लिए इस जीसीसी और बजना के साथ विफल है। बजना उदाहरण के लिए कहते हैं
Compilation finished with errors:
source.cpp:8:10: error: no matching constructor for initialization of 'A'
f(A());
^~~
source.cpp:1:21: note: candidate constructor not viable: expects an l-value for 1st argument
struct A { A(); A(A&); };
^
source.cpp:1:16: note: candidate constructor not viable: requires 0 arguments, but 1 was provided
struct A { A(); A(A&); };
^
source.cpp:4:13: note: passing argument to parameter here
void f(A);
वे पहली बार f
क्यों चयन करते हैं, जब दूसरी f
ठीक काम करता है? अगर मैं पहले f
को हटा देता हूं, तो कॉल सफल हो जाता है। क्या मेरे लिए अधिक अजीब अगर मैं ब्रेस आरंभीकरण उपयोग करते हैं, यह भी ठीक
int main() {
f({A()});
}
वे सभी दूसरे f
फोन काम करता है।
धन्यवाद! मुझे '{...}' मामले के लिए ऐसा कोई नियम नहीं मिल रहा है। क्या यह समझाता है कि '{...}' केस क्यों काम करता है? –
@ जोहान्सचैब-लिटब: मुझे यकीन नहीं है, tbh, आप फ़ंक्शन को _braced-init-list_ के साथ कॉल कर रहे हैं, इसलिए नियम निश्चित रूप से अलग हैं। –
@ जोहान्सचैब-लिटब देखें [over.ics.list]। मुझे लगता है कि [over.ics के साथ क्या करना है।रेफरी]/3 (मैंने पहले आपके कोड को गलत तरीके से पढ़ा था): व्यवहार्य कार्यों के उप-समूह को बनाते समय, ctor 'ए (ए और) 'को व्यवहार्य नहीं माना जाता है क्योंकि यह एक अस्थायी रूप से एक गैर-कॉन्स लैव्यू संदर्भ के लिए बाध्य करता है। – dyp