গ্লোবাল কনস্ট চরটি []] কনটেক্সপ্রিং স্ট্রিং_ভিউয়ের সাথে প্রতিস্থাপনকারী কোনও গেটচাস?


17

আমাদের দল 10+ বছরের পুরানো সি ++ কোড বেস নিয়ে কাজ করছে এবং সম্প্রতি একটি সি ++ 17 সংকলকটিতে স্যুইচ করেছে। সুতরাং আমরা আমাদের কোডটি আধুনিকীকরণের উপায়গুলি সন্ধান করছি। ইউটিউবে একটি সম্মেলনের আলাপে আমি const char*বিশ্বব্যাপী স্ট্রিংগুলির সাথে প্রতিস্থাপন করার পরামর্শটি শুনেছিলাম constexpr string_view।

যেহেতু আমরা const char*আমাদের কোডে বেশ কয়েকটি বৈশ্বিক স্ট্রিং ধ্রুবক পেয়েছি, আমি জিজ্ঞাসা করতে চাই যে আমাদের সচেতন হওয়া দরকার এমন কোনও গোটচ বা সম্ভাব্য সমস্যা আছে কি না?

উত্তর:


15

এই বিষয়গুলি সম্পর্কে সচেতন হওয়া মূল্যবান হতে পারে:

  1. std::string_viewnullনির্ধারিত হওয়ার দরকার নেই । সুতরাং আপনি যদি কিছু const char*দ্বারা string_viewপ্রতিস্থাপন করেন এবং এর মাধ্যমে পূর্ব- nullনির্ধারিত char*সাবস্ট্রিংগুলির নির্মাণ প্রতিস্থাপন করেন তবে আপনি অন্তর্নিহিত পয়েন্টারটি কোনও এপিআই-তে পাস করতে পারবেন না যা একটি- নির্ধারিত স্ট্রিং আশা করে । উদাহরণ (ইউবি ব্যতীত, তবে এটি খুব সহজেই গঠনযোগ্য)string_viewstd::string_view::substrnull

    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()এপিআই তে পাস করার পরিবর্তে কি করবেন ?
— darune

@ সদরুন এটি একটি বিকল্প, তবে তারপরে এপিআইর আজীবন অনুমানগুলি পরীক্ষা করা উচিত, তাই না ?! আপনি যদি যান someLegacyFct(std::string(sv).c_str())এবং এই ব্যাকএন্ডটি কোনওভাবে পয়েন্টার সঞ্চয় করে ...
— lubgr

এটি সঠিক - কেবলমাত্র সেই আজীবন অনুমানের সাথে
— ই

দ্বিতীয় সংখ্যাটি "ভাগ্যক্রমে" আমাদের জন্য বড় বিষয় হয়ে উঠবে না। আমাদের সংস্থার কাঠামোর একটি নিজস্ব স্ট্রিং ক্লাস রয়েছে (আমি জানি ...), একটি সুস্পষ্ট নির্মাতার সাথে const char*। সুতরাং এর std::stringথেকে সুস্পষ্ট নির্মাণ string_viewকেবল আমাদের ক্ষেত্রে সামঞ্জস্যপূর্ণ হবে।
— পিক্সেলসপ্রেম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.