के साथ रैवल्यू को समाप्त करने के लिए लालसा decaying यदि प्रश्न शीर्षक गलत है, तो मैं क्षमा चाहता हूं - लेकिन मुझे यह समझने में कठिनाई हो रही है कि यहां क्या हो रहा है। ,ऑटो त्रुटि
void func(foo& f) {
foo bar{f};
}
हालांकि
जब मैं ऑटो का उपयोग करें::
struct foo {
foo(foo&);
};
निम्नलिखित कोई त्रुटि नहीं है:
निम्नलिखित वर्ग पर विचार करें
void func(foo& f) {
auto bar = foo{f};
}
मैं (जीसीसी) मिलती है:
test.cpp: In function ‘void func(foo&)’:
test.cpp:6:21: error: no matching function for call to ‘foo::foo(foo)’
test.cpp:6:21: note: candidate is:
test.cpp:2:5: note: foo::foo(foo&)
test.cpp:2:5: note: no known conversion for argument 1 from ‘foo’ to ‘foo&’
(बजना)
test.cpp:6:10: error: no matching constructor for initialization of 'bar'
auto bar = foo{f};
^ ~~~~~~
test.cpp:2:5: note: candidate constructor not viable: expects an l-value for 1st argument
foo(foo&);
^
किसी कृपया समझा क्यों यह एक त्रुटि है?
धन्यवाद!
संपादित करें: यह काम करता है अगर मैं foo में एक प्रति-निर्माता जोड़ता हूं। हालांकि, मैं इस धारणा के तहत था कि परिवर्तनीय घोषणा + '=' वाक्यविन्यास के दाहिने तरफ कन्स्ट्रक्टर को स्पष्ट कॉल का विशेष रूप से इलाज किया जाता है और यह एक प्रति-निर्माण नहीं बल्कि प्रत्यक्ष प्रारंभिकता है।
क्या संकलक कॉपी कन्स्ट्रक्टर को कॉल छोड़ देगा? मैं इस धारणा के तहत था कि संकलक इसे सीधे प्रारंभिक रूप में मानेंगे। –
एंड्रॉइड पर अहह टाइपिंग धीमा है, और –
@RobertMason संकलक को प्रतिलिपि बनाने का कोई तरीका नहीं है संकलक एक प्रतिलिपि बनाने वाले को कॉल कर सकता है जिसका कोई दुष्प्रभाव नहीं है, लेकिन कॉपी कन्स्ट्रक्टर अभी भी कॉल करने योग्य होना चाहिए। – Oktalist