c++ - update - upcoming elections in india 2019




Int को std:: string में जोड़ें (3)

मैंने एक std::string एक int को जोड़ने के लिए दो अलग-अलग तरीकों की कोशिश की, और मेरे आश्चर्य के लिए, मुझे अलग-अलग परिणाम मिले:

#include <string>

int main()
{
    std::string s;
    s += 2;     // compiles correctly
    s = s + 2;  // compiler error

    return 0;
}

जब मैं += ऑपरेटर का उपयोग करता हूं, तो इसे सही तरीके से क्यों संकलित और काम करता है, लेकिन जब मैं + ऑपरेटर का उपयोग करता हूं तो असफल हो जाता हूं?

मुझे नहीं लगता कि सवाल यह है कि कैसे एक एसटीडी :: स्ट्रिंग और एक इंट को अलग करना है?

उस प्रश्न में, कोई भी उत्तर += ऑपरेटर का उपयोग नहीं करता है += और std::string += और ऑपरेटर के बीच का अंतर मेरे संदेह को हल करने की कुंजी है।

सच कहूँ तो, यह सवाल समझाने के लिए एक अच्छा उदाहरण है कि c ++ मास्टर करना इतना मुश्किल क्यों है।


अपनी string जोड़ने का सही तरीका होगा

std::string s;
s += std::to_string(2);
s = s + std::to_string(2);

जबकि @CoryKramer उत्तर आपको स्ट्रिंग में पूर्णांक जोड़ने का सही तरीका देता है, यह नहीं बताता है कि निर्देश s = s + 2 क्यों संकलित नहीं करता है।

दो निर्देश के बीच का अंतर यह है कि पहले एक में आप std::string का s = = ऑपरेटर का उपयोग करते हैं जबकि दूसरे अनुदेश में, कंपाइलर 2 को एक स्ट्रिंग में डालने का प्रयास करता है।

int और std::string बीच कोई निहित रूपांतरण नहीं है। हालाँकि, आप एक int को char डाल सकते हैं, इसलिए यही कारण है कि s += 2 काम करता है।


TL, DR operator+= class string में एक क्लास मेंबर फंक्शन है, जबकि operator+ एक टेम्प्लेट फंक्शन है।

मानक वर्ग template<typename CharT> basic_string<CharT> ने फंक्शन को overloaded basic_string& operator+=(CharT) , और string केवल basic_string<char>

मानों के रूप में, जो निम्न प्रकार में फिट होते हैं, उन्हें स्वचालित रूप से उस प्रकार में डाला जा सकता है, अभिव्यक्ति में s += 2 , 2 को int रूप में नहीं माना जाता है, लेकिन इसके बजाय char । इसका ठीक वैसा ही प्रभाव है जैसा कि s += '\x02' । ASCII कोड 2 (STX) के साथ एक वर्ण जोड़ा गया है, कि चरित्र '2' (ASCII मान 50, या 0x32 के साथ)।

हालांकि, स्ट्रिंग में string operator+(int) तरह एक अतिभारित सदस्य फ़ंक्शन नहीं है, s + 2 एक वैध अभिव्यक्ति नहीं है, इस प्रकार संकलन के दौरान एक त्रुटि फेंकता है। (अधिक जानकारी के लिए)

आप इन तरीकों से स्ट्रिंग में ऑपरेटर + फ़ंक्शन का उपयोग कर सकते हैं:

s = s + char(2); // or (char)2
s = s + std::string(2);
s = s + std::to_string(2); // C++11 and above only

2 के बारे में चिंतित लोगों के लिए 2 स्वचालित रूप से operator+ साथ char करने के लिए क्यों नहीं डाला जाता है

template <typename CharT>
  basic_string<CharT>
  operator+(const basic_string<CharT>& lhs, CharT rhs);

ऊपर s + 2 में प्लस ऑपरेटर के लिए प्रोटोटाइप [नोट] है , और क्योंकि यह एक टेम्पलेट फ़ंक्शन है, इसलिए इसे operator+<char> और operator+<int> दोनों के कार्यान्वयन की आवश्यकता होती है, जो कि परस्पर विरोधी है। विवरण के लिए, देखें कि टेम्प्लेट फ़ंक्शन के लिए स्वचालित डाउनकास्टिंग क्यों लागू नहीं की जाती है?

इस बीच, operator+= का प्रोटोटाइप operator+= है:

template <typename CharT>
class basic_string{
    basic_string&
      operator+=(CharT _c);
};

आप देखते हैं, यहां कोई भी टेम्पलेट नहीं है (यह एक क्लास मेंबर फंक्शन है), इसलिए कंपाइलर ने टाइप किया कि चारटी क्लास इम्प्लीमेंटेशन से char है, और int(2) अपने आप char(2) में डाली जाती है।

नोट: C ++ मानक से स्रोत को कॉपी करते समय अनावश्यक कोड छीन लिया जाता है। जिसमें पठनीयता में सुधार लाने के लिए टेम्प्लेट क्लास "बेसिक_स्ट्रिंग" और अनावश्यक अंडरस्कोर के लिए टाइप 2 और 3 (ट्रिटस एंड एलोकेटर) शामिल हैं।





stdstring