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


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.