जब मैं ideone पर निम्नलिखित संकलन करने का प्रयास:मानक लाइब्रेरी में + = वैध अस्थायी क्यों हैं?
class X
{
public:
friend X& operator+=(X& x, const X& y);
};
X& operator+=(X& x, const X& y) { return x; }
int main()
{
X() += X();
}
जैसी उम्मीद थी, इस एक संकलन त्रुटि फेंकता है, क्योंकि आप एक गैर स्थिरांक संदर्भ के लिए एक अस्थायी पारित नहीं कर सकते हैं।
हालांकि, निम्नलिखित ideone पर सफलतापूर्वक संकलित:
std::string() += std::string();
नहीं चाहिए ऊपर मेरी उदाहरण की तरह इस त्रुटि?
संपादित करें:
std :: स्ट्रिंग() एक सदस्य के रूप में आपरेशन +=
को परिभाषित करता है, तो क्यों यह इस करता है जब इस तरह के उपयोग बाएं हाथ की ओर एक अस्थायी होने के लिए अनुमति देता है? जैसा कि मैंने ऊपर दिया है और अस्थायी मुद्दों के संदर्भ से बचें, इसे क्यों परिभाषित नहीं करें?
रिकॉर्ड के लिए वीसी ++ 10.0 में संकलन के साथ दोनों चेतावनी 'चेतावनी C4239: गैर-मानक विस्तार का उपयोग:' तर्क ':' एक्स 'से' एक्स '' –
@DougT में रूपांतरण।: वीएस एक विस्तार के रूप में गैर-कॉन्स रेफ को बाध्यकारी temps की अनुमति देता है, इसलिए उत्तर देने के बाद प्रश्न को मूल रूप से बदलने के लिए –
-1 पर इसका परीक्षण करने के लिए यह उपयोगी टूलचैन नहीं है। अछा नहीं लगता। यदि आपके पास फॉलो-अप है - एक अलग प्रश्न पूछें, मूल उत्तर देने के बाद पूरी तरह से कुछ और पूछने के लिए अपने स्वयं के प्रश्न को हाइजैक न करें। – littleadv