यह an earlier question about why I can't use a brace-enclosed initializer as an argument to operator+
पर एक फॉलो-अप है, जिसे this earlier question on the subject पर देखकर हल किया गया था।मैं ऑपरेटर + = के दाहिने हाथ पर प्रारंभकर्ता सूचियों का उपयोग क्यों कर सकता हूं लेकिन ऑपरेटर + नहीं?
पर विचार करें निम्नलिखित सी ++ कोड है, जो आप try live at ideone.com कर सकते हैं:
#include <iostream>
#include <initializer_list>
using namespace std;
struct AddInitializerList {
void operator+= (initializer_list<int> values) {
// Do nothing
}
void operator+ (initializer_list<int> values) {
// Do nothing
}
};
int main() {
AddInitializerList adder;
adder += {1, 2, 3}; // Totally legit
adder + {1, 2, 3}; // Not okay!
return 0;
}
main
में लाइन लगा कर संलग्न प्रारंभकर्ता सूची के साथ operator+
का उपयोग करता है संकलन नहीं करता है (और है कि पहले सवाल पूछने के बाद, मैं अब पता है कि यह क्यों है)। हालांकि, मैं उलझन में हूं कि opeartor+=
का उपयोग main
में वास्तव में ठीक क्यों संकलित करता है।
मैं उलझन में हूं कि मैं +=
को अधिभार क्यों अधिभारित कर सकता हूं और यह ठीक काम करता है, जबकि +
ओवरलोडिंग यहां काम नहीं कर रहा है। क्या मानक में कोई विशेष प्रावधान है जो +=
ऑपरेटर के संदर्भ में ब्रेस-संलग्न प्रारंभकर्ताओं को अनुमति देता है लेकिन +
ऑपरेटर नहीं? या यह सिर्फ एक अजीब कंपाइलर quirk है?
आपने अपना कंपाइलर निर्दिष्ट नहीं किया है, लेकिन मैं इसे जीसीसी 6.3.1 के साथ विफल करता हूं, जो मुझे "त्रुटि: अपेक्षित प्राथमिक अभिव्यक्ति 'से पहले {{टोकन" के साथ छाल देता है। –
मुझे लगता है कि घुंघराले ब्रेसिज़ सभी असाइनमेंट ऑपरेटरों के लिए समर्थित है। –
और 'योजक + प्रारंभकर्ता_सूची {1, 2, 3};' ठीक काम करता है। –