कोई कॉन्स्ट्रेक्स स्ट्रिंग_व्यू के साथ ग्लोबल कास्ट चार [] का स्थान ले रहा है?


17

हमारी टीम 10 + वर्ष पुराने C ++ कोड बेस के साथ काम कर रही है और हाल ही में C ++ 17 कंपाइलर पर स्विच किया गया है। इसलिए हम अपने कोड को आधुनिक बनाने के तरीकों की तलाश कर रहे हैं। YouTube पर एक कॉन्फ्रेंस टॉक में मैंने सुझाव को सुना, const char*वैश्विक तार को बदलने के लिए constexpr string_view

चूँकि हमें const char*अपने कोड में बहुत सारे ऐसे वैश्विक स्ट्रिंग स्थिरांक मिले हैं, मैं पूछना चाहता हूं कि क्या कोई ऐसी कोई समस्या या संभावित मुद्दे हैं जिनसे हमें अवगत होने की आवश्यकता है?

जवाबों:


15

इन मुद्दों के बारे में पता होने लायक हो सकता है:

  1. std::string_viewकी आवश्यकता नहीं है null-minminated। इसलिए यदि आप कुछ बदलने के const char*द्वारा string_viewऔर एक पहले से के निर्माण की जगह null-terminated char*एक से सबस्ट्रिंग string_viewके माध्यम से std::string_view::substr, आप एक API कि एक उम्मीद करने के लिए अंतर्निहित सूचक पारित नहीं हो सकता null-terminated स्ट्रिंग। उदाहरण (यूबी के बिना, लेकिन यह आसानी से निर्माण योग्य है,):

    void legacy(const char *str) {
       std::printf("%s\n", str);
    }
    
    constexpr std::string_view sv1 = "abcde";
    constexpr std::string_view sv2 = sv1.substr(0, 2); // view on "ab"
    
    legacy(sv2.data()); // Not intended: prints "abcde" 
  2. जब आप स्पष्ट रूप std::stringसे एक से निर्माण const char*कर सकते हैं, तो आप ऐसा नहीं कर सकते std::string_view। विचार यह है कि एक गहरी प्रतिलिपि कवर के तहत नहीं होनी चाहिए, लेकिन केवल जब स्पष्ट रूप से अनुरोध किया गया हो। उदाहरण:

    std::map<std::string, int> m;
    constexpr std::string_view sv = "somekey";
    constexpr const char *old = "somekey";
    
    m[old] = 42; // works as expected
    m[sv] = 42; // fails to compile
    m[std::string(sv)] = 42; // be explicit, this is ok

    const char*आपकी परियोजना में वैश्विक उदाहरणों के मौजूदा उपयोग के आधार पर , इस व्यवहार के लिए विभिन्न स्थानों पर मैनुअल हस्तक्षेप की आवश्यकता हो सकती है।


यह गैर-शून्य समाप्ति निश्चित रूप से एक गोत्र है - आउच। अब मुझे हमारे एसवी से गुजरने की जरूरत है। मुझे लगता है कि आप std::string(sv).c_str()एपीआई को पारित करने के बजाय क्या करेंगे ?
une

@ डार्यून यह एक विकल्प है, लेकिन फिर एपीआई के जीवनकाल की मान्यताओं की जाँच की जानी चाहिए, है ना ?! अगर आप साथ जाते हैं someLegacyFct(std::string(sv).c_str())और यह बैकएंड किसी तरह पॉइंटर को स्टोर कर
लेता है

यह सही है - केवल उस आजीवन धारणा के साथ
darune

दूसरा मुद्दा "सौभाग्य से" हमारे लिए बहुत बड़ी बात नहीं है। हमारी कंपनी की रूपरेखा में स्वयं स्ट्रिंग क्लास है (मुझे पता है ...), एक स्पष्ट const char*कंस्ट्रक्टर के साथ। तो की स्पष्ट निर्माण std::stringसे string_viewसिर्फ हमारे मामले में लगातार हो जाएगा।
PixelSupreme
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.