কনস্টেক্সপ্রে স্ট্যান্ড স্ট্রিং ব্যবহার করা কি সম্ভব?


175

সি ++ 11, উবুন্টু 14.04, জিসিসি ডিফল্ট টুলচেন ব্যবহার করে

এই কোড ব্যর্থ:

constexpr std::string constString = "constString";

ত্রুটি: কনস্টেক্সপ্র ভেরিয়েবল 'কনস্ট্রিং' এর টাইপ 'কনস্ট স্ট্রিং {ওরফে কনস্ট স্ট্র্যাড :: বেসরাল_স্ট্রিং}' আক্ষরিক নয় ... কারণ ... 'স্টাড :: বেসিক_স্ট্রিং'-এ একটি তুচ্ছ ত্রুটিযুক্ত ডেস্ট্রাক্টর রয়েছে

এটি ব্যবহার করা সম্ভব std::stringএকটি constexpr? (আপাতভাবে নয় ...) যদি তা হয় তবে কীভাবে? একটিতে অক্ষরের স্ট্রিং ব্যবহারের বিকল্প উপায় আছে কি constexpr?


2
std::stringআক্ষরিক ধরণের নয়
পাইওটার স্কটনিকিক

7
@ পাইওটিআরএস - প্রশ্নটি বলেছে যে ...
ভেক্টর

4
@ ভেক্টর আমি আপনাকে জিজ্ঞাসা করেছি কনসটেক্সপ্রপ কীসের জন্য বা আপনি কেন std::stringকনসেক্সপ্রপ হতে চান ? এসওতে বিভিন্ন সংকলন-সময়ের স্ট্রিং বাস্তবায়ন রয়েছে। আপনি যদি ত্রুটি বার্তাটি বুঝতে পারছেন এবং কেবল আক্ষরিক প্রকারগুলিই কনটেক্সপ্রপ তৈরি করতে পারবেন তবে আপনি যদি একটি অ-আক্ষরিক ধরণের কনটেক্সপ্রপ তৈরি করতে পারেন তবে এটি জিজ্ঞাসা করার কী অর্থ? পাশাপাশি বেশ কিছু কারণে এক একটি constexpr উদাহরণস্বরূপ করতে চান করতে পারে, তাই আমি আপনাকে আপনার প্রশ্নের নির্মল হয়,
পাযত্র Skotnicki

2
হ্যাঁ @ পাইওটিআরএস হিসাবে। বলেন, সেখানে constexprস্ট্রিং বাস্তবায়ন আছে। std::stringতাদের মধ্যে একটি নয়।
টেনফোর

3
@ পাইওটিআরএস - এসও - তে বেশ কয়েকটি সংকলন-কালীন স্ট্রিং বাস্তবায়ন রয়েছে - ঠিক আছে, ধন্যবাদ, বুঝেছি। এটি আমার পক্ষে কোনও বিকল্প নয় তবে এটি আমার প্রশ্নের উত্তর দেয়: কোনওভাবেই স্ট্যান্ড :: স্ট্রিং কাজ করবে না। আমি দশগুণে মন্তব্য করে, আমি ভাবছিলাম যে স্ট্যান্ড :: স্ট্রিংটি যেভাবে কাজ করবে সেভাবে ব্যবহার করার কোনও উপায় আছে কিনা? এমন অনেক কৌশল আছে যা আমি অবশ্যই অবগত নই।
ভেক্টর

উত্তর:


167

না, এবং আপনার সংকলক ইতিমধ্যে আপনাকে একটি বিস্তৃত ব্যাখ্যা দিয়েছে।

তবে আপনি এটি করতে পারেন:

constexpr char constString[] = "constString";

রানটাইম এ, এটি std::stringযখন প্রয়োজন হয় একটি নির্মাণ করতে ব্যবহার করা যেতে পারে ।


78
না কেন constexpr auto constString = "constString";? সেই কুৎসিত অ্যারে সিনট্যাক্স ব্যবহার করার দরকার নেই ;-)
স্টেফান

80
এই প্রশ্নের প্রসঙ্গে, এটি আরও পরিষ্কার। আমার বক্তব্যটি আপনি কোন স্ট্রিংয়ের ধরণগুলি বেছে নিতে পারেন সে সম্পর্কে। আমি যখন ব্যবহার করার জন্য ডেটা টাইপকে জোর দেওয়ার চেষ্টা করছিলাম তখন তার char[]চেয়ে বেশি ভার্বোজ / স্পষ্ট auto
টেনফোর

7
@ মজাদার অধিকার, এটি একটি ভাল বিষয়। আমি অনুমান করি আমি মাঝে মাঝে auto;-) ব্যবহারের দিকে কিছুটা বেশি মনোযোগ কেন্দ্রীভূত করি
স্টেফান

1
@FelixDombek না, কিন্তু গ ++, 17 আপনি ব্যবহার করতে পারে constexpr auto s = "c"sv;প্রবর্তনের কারণেstring_view
কোনটা

6
এই প্রসঙ্গে কোনও চর অ্যারে সংবিধানের অর্থ কি? আপনি যদি স্ট্রিং তৈরি করতে এটি ব্যবহার করেন তবে এটি যেভাবেই অনুলিপি করা হবে। আক্ষরিক স্ট্রিংয়ের কনস্ট্রাক্টরে পাস করা এবং এর সাথে এই জাতীয় কনস্টেক্সপ্র অ্যারে পাস করার মধ্যে পার্থক্য কী?
KjMag

167

সি ++ 20 হিসাবে , হ্যাঁ।

সি ++ 17 হিসাবে , আপনি ব্যবহার করতে পারেন string_view:

constexpr std::string_view sv = "hello, world";

string_viewহ'ল একটি stringমত বস্তু যা অবজেক্টের কোনও অনুক্রমের জন্য একটি অপরিবর্তনীয়, অ-মালিকানাধীন রেফারেন্স হিসাবে কাজ charকরে।


6
সচেতন থাকুন যখনই আপনি এই ধ্রুবকটি const std::string&একটি নতুন স্ট্যান্ড :: স্ট্রিং গ্রহণ করে কোনও ফাংশনে পৌঁছে যান। ধ্রুবক তৈরি করার সময় এটি সাধারণত যার মনে ছিল তার বিপরীত। অতএব, আমি বলতে চাই যে এটি একটি ভাল ধারণা নয়। কমপক্ষে আপনাকে সাবধান হতে হবে।
র‌্যাম্বো রামন 10

29
@ র্যাম্বোরামন string_viewসুস্পষ্টভাবে রূপান্তরিত নয় string, সুতরাং দুর্ঘটনাক্রমে একটি stringথেকে একটি তৈরির খুব কম ঝুঁকি রয়েছে string_view। বিপরীতভাবে, char const* হয় পরোক্ষভাবে থেকে পরিবর্তনীয় string, তাই ব্যবহার string_viewআসলে এই অর্থে নিরাপদ।
জোসেফ থমসন

4
স্পষ্টতার জন্য ধন্যবাদ। আমি সম্পূর্ণরূপে একমত এবং সত্যিই ভুলে গেছি যে string_viewএটি রূপান্তরিত নয় string। আমি যে সমস্যাটি নিয়ে এসেছি আইএমও এখনও বৈধ তবে এটি string_viewবিশেষভাবে প্রযোজ্য নয় । বাস্তবে, আপনি যেমনটি উল্লেখ করেছেন, এটি সে ক্ষেত্রে আরও নিরাপদ।
র‌্যাম্বো র‌্যামন

5
এই উত্তরটি string_viewকেবল একটি লিঙ্কের পরিবর্তে কী তা সম্পর্কে আরও বেশি কিছু বলে যদি দুর্দান্ত হয়।
এরিক

22

সি ++ 20 constexprস্ট্রিং এবং ভেক্টর যুক্ত করবে

নিম্নলিখিত প্রস্তাবটি আপাতভাবে গ্রহণ করা হয়েছে : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0980r0.pdf এবং এটি নির্মাণকারীদের যুক্ত করে যেমন:

// 20.3.2.2, construct/copy/destroy
constexpr
basic_string() noexcept(noexcept(Allocator())) : basic_string(Allocator()) { }
constexpr
explicit basic_string(const Allocator& a) noexcept;
constexpr
basic_string(const basic_string& str);
constexpr
basic_string(basic_string&& str) noexcept;

সমস্ত / সর্বাধিক পদ্ধতির কনটেক্সারপ্র সংস্করণ ছাড়াও।

জিসিসি 9.1.0 হিসাবে কোনও সমর্থন নেই, নিম্নলিখিতটি সংকলন করতে ব্যর্থ হয়েছে:

#include <string>

int main() {
    constexpr std::string s("abc");
}

সঙ্গে:

g++-9 -std=c++2a main.cpp

ত্রুটি সহ:

error: the type const string {aka const std::__cxx11::basic_string<char>’} of constexpr variable s is not literal

std::vectorএখানে আলোচনা করা হয়েছে: কনস্টেক্সপ্রেড স্ট্যান্ড :: ভেক্টর তৈরি করতে পারে না

উবুন্টু 19.04 এ পরীক্ষিত।


19

যেহেতু সমস্যাটি অ-তুচ্ছ ডেস্ট্রাক্টর তাই তাই যদি ডেস্ট্রাক্টরটিকে বাদ দেওয়া হয় তবে এই ধরণের std::stringকোনও constexprউদাহরণ নির্ধারণ করা সম্ভব । এটার মত

struct constexpr_str {
    char const* str;
    std::size_t size;

    // can only construct from a char[] literal
    template <std::size_t N>
    constexpr constexpr_str(char const (&s)[N])
        : str(s)
        , size(N - 1) // not count the trailing nul
    {}
};

int main()
{
    constexpr constexpr_str s("constString");

    // its .size is a constexpr
    std::array<int, s.size> a;
    return 0;
}

18
এই C ++ 17 মূলত string_viewছাড়া যে string_viewআপনি কার্যকারিতা সবচেয়ে দেয় আপনার চেনা ব্যাক্তিদের থেকেstd::string
কোনটা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.