স্থির ধ্রুব স্ট্রিং (শ্রেণীর সদস্য)


445

আমি একটি শ্রেণীর জন্য একটি ব্যক্তিগত স্ট্যাটিক ধ্রুবক চাই (এই ক্ষেত্রে একটি আকৃতি-কারখানা)।

আমি সাজানোর কিছু পেতে চাই।

class A {
   private:
      static const string RECTANGLE = "rectangle";
}

দুর্ভাগ্যক্রমে আমি সি ++ (জি ++) সংকলক থেকে সমস্ত ধরণের ত্রুটি পেয়েছি যেমন:

আইএসও সি ++ সদস্য 'রেকট্যাংল' এর শুরুতে নিষেধাজ্ঞা

অ-অবিচ্ছেদ্য প্রকারের স্ট্যাটিক :: স্ট্রিংয়ের স্থিতিশীল ডেটা সদস্যের অবৈধ ইন-ক্লাস সূচনা

ত্রুটি: 'RECTANGLE' স্থির তৈরি

এটি আমাকে বলে যে এই ধরণের সদস্য ডিজাইন মানের সাথে সম্মতিযুক্ত নয়। # ডেফাইন নির্দেশিকা ব্যবহার না করে কীভাবে আপনার একটি ব্যক্তিগত আক্ষরিক ধ্রুবক (বা সম্ভবত প্রকাশ্য) থাকে (আমি ডেটা বিশ্বতার কুৎসিততা এড়াতে চাই!)

কোন সাহায্য প্রশংসা করা হয়।


15
আপনার সমস্ত দুর্দান্ত উত্তরের জন্য ধন্যবাদ! দীর্ঘজীবী এসও!
lb.

কেউ দয়া করে আমাকে বলতে পারেন একটি 'ইন্টিগ্রাল' টাইপ কি? আপনাকে অনেক ধন্যবাদ.
lb.

1
ইন্টিগ্রাল টাইপগুলি টাইপগুলিকে বোঝায় যা পূর্ণসংখ্যার সংখ্যা উপস্থাপন করে। দেখুন publib.boulder.ibm.com/infocenter/comphelp/v8v101/...
bleater

আপনার কারখানায় প্রাইভেট স্ট্যাটিক স্ট্রিং ভাল সমাধান নয় - বিবেচনা করুন যে আপনার কারখানার ক্লায়েন্টগুলি কী আকারগুলি সমর্থন করে তা জানতে হবে, তাই এটি ব্যক্তিগত স্ট্যাটিকের মধ্যে রাখার পরিবর্তে এটিকে স্ট্যাটিক কনস্ট স্ট্যান্ড :: স্ট্রিং RECTANGLE = "আয়তক্ষেত্র হিসাবে পৃথক নেমস্পেসে রেখে দিন" "।
লুককোডবেকার

যদি আপনার ক্লাসটি একটি টেম্পলেট শ্রেণি হয় তবে স্ট্যাকওভারফ্লো.com
ট্রেভর বয়ড স্মিথ

উত্তর:


470

আপনাকে ক্লাস সংজ্ঞার বাইরে আপনার স্থির সদস্যকে সংজ্ঞায়িত করতে হবে এবং সেখানে আরম্ভকারী সরবরাহ করতে হবে।

প্রথম

// In a header file (if it is in a header file in your case)
class A {   
private:      
  static const string RECTANGLE;
};

এবং তারপর

// In one of the implementation files
const string A::RECTANGLE = "rectangle";

আপনি যে সিনট্যাক্সটি মূলত ব্যবহারের চেষ্টা করছেন (শ্রেণির সংজ্ঞার অভ্যন্তরে প্রারম্ভক) কেবলমাত্র অবিচ্ছেদ্য এবং এনাম প্রকারের সাথেই অনুমোদিত।


সি ++ 17 থেকে শুরু করে আপনার কাছে আরও একটি বিকল্প রয়েছে যা আপনার মূল ঘোষণার সাথে একেবারে অনুরূপ: ইনলাইন ভেরিয়েবল

// In a header file (if it is in a header file in your case)
class A {   
private:      
  inline static const string RECTANGLE = "rectangle";
};

কোন অতিরিক্ত সংজ্ঞা প্রয়োজন।

বা পরিবর্তে আপনি এই বৈকল্পিক এ constএটি ঘোষণা করতে পারেন constexpr। স্পষ্ট inlineআর প্রয়োজন হবে যেহেতু constexprবোঝা inline


8
এছাড়াও, যদি কোনও এসটিএল স্ট্রিং ব্যবহারের জন্য প্রয়োজনীয়তা না থাকে তবে আপনি কেবল একটি কনস্ট চর * সংজ্ঞায়িত করতে পারেন। (কম ওভারহেড)
কেএসমিড্ট

50
আমি নিশ্চিত নই যে এটি সর্বদা কম ওভারহেড - এটি ব্যবহারের উপর নির্ভর করে। এই সদস্যটি যদি কনস্টিং স্ট্রিং গ্রহণ করে এমন ক্রিয়াকলাপগুলির পক্ষে একটি আর্গুমেন্ট হিসাবে পাস করতে বোঝানো হয় তবে, আরম্ভের সময় প্রতিটি কল বনাম একটি স্ট্রিং অবজেক্ট তৈরির জন্য অস্থায়ীভাবে তৈরি করা হবে। স্ট্যাটিক স্ট্রিং অবজেক্ট তৈরি করার জন্য আইএমএইচও ওভারহেড অবহেলাযোগ্য।
টাদিউস কোপেক

23
আমি বরং সব সময় স্ট্যান্ড :: স্ট্রিংয়ের ব্যবহার করতাম। ওভারহেড উপেক্ষিত নয়, তবে আপনার কাছে অনেক বেশি বিকল্প রয়েছে এবং "ম্যাজিক" == এ :: ঠিকানার ঠিকানাগুলির সাথে তুলনা করার জন্য কিছু সঠিক বোকামি লেখার সম্ভাবনা খুব কম ...
ম্যাথিউ এম।

9
char const*ধার্মিকতা এটি আগে সব গতিশীল আরম্ভের সম্পন্ন করা হয় সক্রিয়া করা হয় হয়েছে। সুতরাং যে কোনও অবজেক্টের কনস্ট্রাক্টারে আপনি নির্ভর করতে পারেন RECTANGLEতারপরে আগেই আরম্ভ করা হয়েছে।
জোহানেস স্কাউব - লিটব

8
@cirosantilli: যেহেতু সি ++ initializers মধ্যে সময়ের শুরু থেকে অংশগুলি ছিল সংজ্ঞা না ঘোষণা । এবং ক্লাসের মধ্যে ডেটা সদস্যের ঘোষণাটি ঠিক এটি: একটি ঘোষণা। (অন্যদিকে, কনস্ট্যান্ট ইন্টিগ্রাল এবং এনাম সদস্যের জন্য এবং সি ++ 11 - আক্ষরিক ধরণের
কনস্টের

153

সি ++ 11 এ আপনি এখনই করতে পারেন:

class A {
 private:
  static constexpr const char* STRING = "some useful string constant";
};

30
দুর্ভাগ্যক্রমে এই সমাধানটি স্ট্যান্ড :: স্ট্রিংয়ের জন্য কাজ করে না।
হ্যালো ওয়ার্ল্ড

2
দ্রষ্টব্য: ১. এটি কেবল আক্ষরিক এবং ২ এর সাথে কাজ করে this এটি স্ট্যান্ডার্ড অনুসারে নয়, যদিও Gnu / GCC জরিমানা আদায় করে, অন্য সংকলকরা একটি ত্রুটি ফেলবে throw সংজ্ঞা দেহে থাকতে হয়।
ম্যানুয়েলস্কিনিড

2
@ ম্যানুয়েলস্কিনিড 3r এই "স্ট্যান্ডার্ড কনফর্মটি" না ঠিক কীভাবে? এটি দেখতে বগ-স্ট্যান্ডার্ড সি ++ 11 ব্রেস-বা সমমানের সূচনা বলে মনে হচ্ছে।
আন্ডারস্কোর_ড

3
@ আরভিঘনে, কোনটিই ভুল নয়। constexprবারের constজন্য বোঝায় , টাইপ করার জন্য নয় এটি পয়েন্ট করে। অর্থাত static constexpr const char* constহিসাবে একই static constexpr const char*, কিন্তু না হিসাবে একই static constexpr char*
মিডেনোক

2
@ অ্যাবিস - - আপনার উত্তরের জন্য ধন্যবাদ, এবং আমার আরও একটি উত্তর আছে দয়া করে: কেন এটি অচল থাকতে হবে?
গাই অভ্রাহাম

34

শ্রেণীর সংজ্ঞাগুলির অভ্যন্তরে আপনি কেবল স্থির সদস্য ঘোষণা করতে পারেন । সেগুলি শ্রেণীর বাইরে সংজ্ঞায়িত করতে হয় । সংকলন-সময়ের অবিচ্ছেদ্য ধ্রুবকগুলির জন্য মানটি ব্যতিক্রম করে তোলে যে আপনি সদস্যদের "আরম্ভ করতে" পারেন। যদিও এটি এখনও সংজ্ঞা নয়। উদাহরণ গ্রহণ করা সংজ্ঞা ব্যতীত কাজ করবে না, উদাহরণস্বরূপ।

আমি উল্লেখ করতে যে, আমি const গৃহস্থালি [] উপর এসটিডি :: স্ট্রিং ব্যবহার করে সুবিধা দেখতে না চাই ধ্রুবক জন্য । স্টাডি :: স্ট্রিংটি দুর্দান্ত এবং সমস্ত তবে এটির গতিশীল সূচনা প্রয়োজন। সুতরাং, যদি আপনি কিছু লিখুন

const std::string foo = "hello";

নেমস্পেস স্কোপ এ ফু এর কনস্ট্রাক্টর মূল শুরুর আগেই চালানো হবে এবং এই কনস্ট্রাক্টর হ্যাপ মেমোরিতে ধ্রুবক "হ্যালো" এর একটি অনুলিপি তৈরি করবে। স্টাডি :: স্ট্রিং হওয়ার জন্য আপনার যদি সত্যিই আয়তক্ষেত্রের প্রয়োজন না হয় আপনি ঠিক তেমন লিখতেও পারেন

// class definition with incomplete static member could be in a header file
class A {
    static const char RECTANGLE[];
};

// this needs to be placed in a single translation unit only
const char A::RECTANGLE[] = "rectangle";

সেখানে! কোনও গাদা বরাদ্দ নেই, কোনও অনুলিপি নেই, কোনও গতিশীল সূচনা নেই।

চিয়ার্স, এস।


1
এটি পূর্ব সি ++ 11 উত্তর। স্ট্যান্ডার্ড সি ++ ব্যবহার করুন এবং স্ট্যান্ড :: স্ট্রিং_ভিউ ব্যবহার করুন।

1
সি ++ 11 এর স্ট্যান্ড :: স্ট্রিং_ভিউ নেই।
লুকাস সালিচ

17

এটি কেবলমাত্র অতিরিক্ত তথ্য, তবে আপনি যদি সত্যিই একটি শিরোনাম ফাইলে স্ট্রিং চান তবে এর মতো কিছু চেষ্টা করুন:

class foo
{
public:
    static const std::string& RECTANGLE(void)
    {
        static const std::string str = "rectangle";

        return str;
    }
};

যদিও আমি সন্দেহ করি যে এটি প্রস্তাবিত।


দেখতে দুর্দান্ত লাগছে :) - আপনি কি অনুমান করছেন যে সি ++ ব্যতীত অন্য ভাষায় আপনার পটভূমি রয়েছে?
lb.

5
আমি এটি সুপারিশ করব না। আমি ঘন ঘন এটি করি। এটি সূক্ষ্মভাবে কাজ করে এবং বাস্তবায়ন ফাইলে স্ট্রিংটি রাখার চেয়ে আমি এটি আরও স্পষ্ট মনে করি। স্টাড :: স্ট্রিংয়ের আসল ডেটা যদিও এখনও apગলে রয়েছে। আমি একটি কনস্টের চর * ফিরিয়ে দেব, সেক্ষেত্রে আপনাকে স্ট্যাটিক ভেরিয়েবল ঘোষণা করার দরকার নেই যাতে ঘোষণাপত্রটি কম স্থান (কোড ওয়াইজ) নেবে। যদিও স্বাদের বিষয়।
জুমুলেটর

15

সি ++ 17 এ আপনি ইনলাইন ভেরিয়েবলগুলি ব্যবহার করতে পারেন :

class A {
 private:
  static inline const std::string my_string = "some useful string constant";
};

দ্রষ্টব্য যে এটি অতল অতল 7 এর উত্তরের চেয়ে আলাদা : এটি একটি প্রকৃত std::stringঅবজেক্টকে সংজ্ঞায়িত করে, একটি নয়const char*


আপনি কি মনে করেন না যে inlineব্যবহারটি প্রচুর নকল তৈরি করবে?
শুভা


8

যে শ্রেণিটি সূচনা সিনট্যাক্স ব্যবহার করতে, ধ্রুবক অবশ্যই একটি ধ্রুবক অভিব্যক্তি দ্বারা আরম্ভ ইন্টিগ্রাল বা গণনা টাইপের স্ট্যাটিক কনস্ট হতে হবে।

এটাই বিধিনিষেধ। সুতরাং, এক্ষেত্রে আপনার ক্লাসের বাইরে ভেরিয়েবল সংজ্ঞা দেওয়া দরকার। @ অ্যান্ড্রেটি থেকে উত্তরটি দেখুন


7

শ্রেণীর স্ট্যাটিক ভেরিয়েবলগুলি শিরোনামে ঘোষিত হতে পারে তবে একটি .cpp ফাইলে সংজ্ঞায়িত করতে হবে । এটি কারণ এটি একটি স্থিতিশীল ভেরিয়েবলের কেবলমাত্র একটি উদাহরণ থাকতে পারে এবং সংকলক সিদ্ধান্ত নিতে পারে না যে কোন উত্পন্ন ফাইলটিকে এটি রাখা উচিত যাতে পরিবর্তে আপনাকে সিদ্ধান্ত নিতে হবে।

সি ++ 11 এ ঘোষণার সাথে একটি স্থির মানের সংজ্ঞা রাখতে একটি নেস্টেড স্ট্যাটিক কাঠামো ব্যবহার করা যেতে পারে। এই ক্ষেত্রে স্থির সদস্যটি একটি কাঠামো এবং একটি .cpp ফাইলে সংজ্ঞায়িত করতে হয়, তবে মানগুলি শিরোনামে থাকে।

class A
{
private:
  static struct _Shapes {
     const std::string RECTANGLE {"rectangle"};
     const std::string CIRCLE {"circle"};
  } shape;
};

পৃথক সদস্যদের সূচনা করার পরিবর্তে সম্পূর্ণ স্ট্যাটিক কাঠামোটি .cpp এ শুরু করা হয়:

A::_Shapes A::shape;

মানগুলি অ্যাক্সেস করা হয়

A::shape.RECTANGLE;

বা - যেহেতু সদস্যগুলি ব্যক্তিগত হয় এবং কেবল এ থেকে - ব্যবহার করে বোঝানো হয়

shape.RECTANGLE;

নোট করুন যে এই সমাধানটি এখনও স্ট্যাটিক ভেরিয়েবলগুলির আরম্ভের ক্রমটির সমস্যায় ভুগছে। যখন কোনও স্ট্যাটিক মান অন্য স্ট্যাটিক ভেরিয়েবলটি সূচনা করতে ব্যবহৃত হয়, তখন প্রথমটি আরম্ভ করা হতে পারে না, তবুও।

// file.h
class File {
public:
  static struct _Extensions {
    const std::string h{ ".h" };
    const std::string hpp{ ".hpp" };
    const std::string c{ ".c" };
    const std::string cpp{ ".cpp" };
  } extension;
};

// file.cpp
File::_Extensions File::extension;

// module.cpp
static std::set<std::string> headers{ File::extension.h, File::extension.hpp };

এই ক্ষেত্রে স্ট্যাটিক ভ্যারিয়েবল শিরোনামগুলি লিংকের দ্বারা তৈরি সূচনার ক্রমের উপর নির্ভর করে either ""} বা {".h", ".hpp" either হয় থাকবে।

@ অ্যাবিস by দ্বারা উল্লিখিত হিসাবে আপনি constexprভেরিয়েবলের মানটি সংকলন সময়ে গণনা করা যায় তবে আপনি এটিও ব্যবহার করতে পারেন। তবে আপনি যদি আপনার স্ট্রিংগুলি static constexpr const char*এবং আপনার প্রোগ্রামের ব্যবহারগুলি ঘোষণা করেনstd::string অন্যথায় একটি ওভারহেড হবে কারণ std::stringআপনি যখনই এই ধ্রুবকটি ব্যবহার করেন তখনই একটি নতুন অবজেক্ট তৈরি হবে:

class A {
public:
   static constexpr const char* STRING = "some value";
};
void foo(const std::string& bar);
int main() {
   foo(A::STRING); // a new std::string is constructed and destroyed.
}

ভাল প্রস্তুত উত্তর মার্কো। দুটি বিবরণ: স্থির শ্রেণীর সদস্যদের জন্য একটিতে সিপিপি ফাইলের প্রয়োজন হয় না এবং কোনও ধরণের ধ্রুবকগুলির জন্য দয়া করে std :: স্ট্রিং_ভিউ ব্যবহার করুন।

4

বর্তমান মানটি কেবল স্থির ধ্রুবক ইন্টিগ্রাল ধরণের ক্ষেত্রে এ জাতীয় সূচনা করার অনুমতি দেয়। সুতরাং আপনার অ্যান্ড্রেটি যেমন ব্যাখ্যা করেছেন তেমন করা দরকার। তবে এটি নতুন সদস্য ইনিশিয়ালাইজেশন সিনট্যাক্সের মাধ্যমে পরবর্তী স্ট্যান্ডার্ডে উপলব্ধ হবে ।


4

সম্ভব কেবল:

static const std::string RECTANGLE() const {
    return "rectangle";
} 

অথবা

#define RECTANGLE "rectangle"

11
যখন টাইপ করা ধ্রুবক ব্যবহার করা যায় তখন # ডেফাইন ব্যবহার করা ভুল।
আর্টুর সিজ্জা

আপনার প্রথম উদাহরণটি মূলত একটি ভাল সমাধান তবে যদি আপনার না থাকে constexprতবে আপনি কোনও স্থির ফাংশন করতে পারবেন না const
ফ্র্যাঙ্ক পাফার

এই সমাধান এড়ানো উচিত। এটি প্রতিটি অনুরোধে একটি নতুন স্ট্রিং তৈরি করে। এটি আরও ভাল হবে:static const std::string RECTANGLE() const { static const std::string value("rectangle"); return value; }
ওজ সলোমন

রিটার্নের মান হিসাবে পূর্ণ-বদ্ধ কন্টেইনারটি কেন ব্যবহার করছেন? স্ট্যান্ডিং :: স্ট্রিং_উইউউ .. এটির বিষয়বস্তু এই ক্ষেত্রে কার্যকর থাকবে। স্ট্রিং ভিউ তৈরি করতে এবং ফিরে পেতে আরও ভাল স্ট্রিং লিটারেল ব্যবহার করুন ... এবং সর্বশেষে তবে কমপক্ষে রিটার্ন মানটির কোনও অর্থ বা প্রভাব নেই .. হ্যাঁ, এবং কিছু শিরোলেখটিতে এটি ইনলাইন হিসাবে, একটি স্ট্যাটিক নয় নেমস্পেসের নাম দেওয়া হয়েছে ... এবং দয়া করে এটি কনস্টেক্সপ্রে পরিণত করুন

4

আপনি হয় const char*উপরের উল্লিখিত সমাধানটির জন্য যেতে পারেন , তবে তারপরে যদি আপনার সারাক্ষণ স্ট্রিংয়ের প্রয়োজন হয় তবে আপনার প্রচুর ওভারহেড লাগবে।
অন্যদিকে, স্ট্যাটিক স্ট্রিংটির গতিশীল সূচনা প্রয়োজন, সুতরাং আপনি যদি অন্য কোনও গ্লোবাল / স্ট্যাটিক ভেরিয়েবলের আরম্ভের সময় এর মানটি ব্যবহার করতে চান তবে আপনি আরম্ভের ক্রমের সমস্যাটিকে আঘাত করতে পারেন। এটি এড়ানোর জন্য, সস্তারতম জিনিসটি গেটারের মাধ্যমে স্থির স্ট্রিং অবজেক্টে অ্যাক্সেস করা হচ্ছে, যা আপনার অবজেক্টটি আরম্ভ করা হয়েছে কিনা তা পরীক্ষা করে।

//in a header  
class A{  
  static string s;   
public:   
  static string getS();  
};  
//in implementation  
string A::s;  
namespace{  
  bool init_A_s(){  
    A::s = string("foo");   
    return true;  
  }  
  bool A_s_initialized = init_A_s();  
}  
string A::getS(){      
  if (!A_s_initialized)  
    A_s_initialized = init_A_s();  
  return s;  
}  

শুধুমাত্র ব্যবহার করতে মনে রাখবেন A::getS()। যেহেতু যে কোনও থ্রেডিং কেবল তখনই শুরু করা যেতে পারে main()এবং এর A_s_initializedআগে শুরু করা হয়েছে , main()এমনকি আপনাকে বহুবিবাহিত পরিবেশে লক লাগবে না। A_s_initializedডিফল্ট হিসাবে 0 হয় (গতিশীল সূচনা হওয়ার আগে), তাই আপনি যদি ব্যবহার করেনgetS() আরম্ভ আগে , আপনি init ফাংশনটি নিরাপদে কল করুন।

বিটিডব্লিউ, উপরের উত্তরে: " স্ট্যাটিক কনস্ট স্টাড :: স্ট্রিং রেকট্যাঙ্গেল () কনস্ট ", স্ট্যাটিক ফাংশনগুলি constহ'ল কারণ তারা যে কোনও উপায়ে যদি রাষ্ট্রকে পরিবর্তন করতে না পারে (এই পয়েন্টারটি নেই)।


4

2018 এবং সি ++ 17 এ দ্রুত এগিয়ে।

  • std :: স্ট্রিং ব্যবহার করবেন না, std :: স্ট্রিং_ভিউ আক্ষরিক ব্যবহার করুন
  • দয়া করে 'কনস্টেক্সপ্র' বেলো লক্ষ্য করুন। এটি একটি "সংকলন সময়" প্রক্রিয়াও।
  • কোন ইনলাইন পুনরাবৃত্তি মানে না
  • এর জন্য কোনও সিপিপি ফাইলের প্রয়োজন নেই
  • স্ট্যাটিক_সেট্রে শুধুমাত্র সংকলনের সময় 'কাজ' করে

    using namespace std::literals;
    
    namespace STANDARD {
    constexpr 
    inline 
    auto 
    compiletime_static_string_view_constant() {
    // make and return string view literal
    // will stay the same for the whole application lifetime
    // will exhibit standard and expected interface
    // will be usable at both
    // runtime and compile time
    // by value semantics implemented for you
        auto when_needed_ =  "compile time"sv;
        return when_needed_  ;
    }

    };

উপরে একটি যথাযথ এবং আইনী মান সি ++ নাগরিক। এটি যে কোনও এবং সমস্ত স্ট্যান্ড :: অ্যালগরিদম, পাত্রে, ইউটিলিটিস এবং এ জাতীয় একটিতে সহজেই জড়িত হতে পারে। উদাহরণ স্বরূপ:

// test the resilience
auto return_by_val = []() {
    auto return_by_val = []() {
        auto return_by_val = []() {
            auto return_by_val = []() {
return STANDARD::compiletime_static_string_view_constant();
            };
            return return_by_val();
        };
        return return_by_val();
    };
    return return_by_val();
};

// actually a run time 
_ASSERTE(return_by_val() == "compile time");

// compile time 
static_assert(
   STANDARD::compiletime_static_string_view_constant() 
   == "compile time" 
 );

স্ট্যান্ডার্ড সি ++ উপভোগ করুন


ব্যবহার করুন std::string_viewধ্রুবক জন্য শুধুমাত্র যদি আপনি ব্যবহারstring_view সমস্ত কার্যক্রমে প্যারামিটার । যদি আপনার কোনও ফাংশন একটি const std::string&প্যারামিটার ব্যবহার করে , আপনি যখন string_viewসেই পরামিতিটির মাধ্যমে ধ্রুবকটি পাস করেন তখন একটি স্ট্রিংয়ের অনুলিপি তৈরি করা হবে । যদি আপনার ধ্রুবকগুলি ধরণের হয় std::stringতবে অনুলিপিগুলি const std::string&পরামিতিগুলির জন্য বা পরামিতিগুলির জন্য তৈরি করা হবে না std::string_view
মার্কো মাহনিč

উত্তম উত্তর, তবে কৌতূহলটি কেন স্ট্রিং_ভিউ কোনও ফাংশন থেকে ফিরে আসছে? inlineভ্যারিয়েবলগুলি তাদের ওডিআর শব্দার্থক শব্দগুলি সহ সি ++ 17 এ আসার আগে এই ধরণের কৌশলটি কার্যকর ছিল । কিন্তু string_view সি ++ অত্যন্ত 17, তাই ঠিক constexpr auto some_str = "compile time"sv;পেশা আছে (এবং আসলে এটা না একটি পরিবর্তনশীল, এটা constexpr, তাই inlineঅন্তর্নিহিত; যদি আপনি একটি পরিবর্তনশীল আছে - অর্থাত কোন constexpr- তারপর inline auto some_str = "compile time"sv;এটা করতে হবে, যদিও কোর্স নামস্থান-পরিধি পরিবর্তনশীল, যা মূলত বিশ্বব্যাপী পরিবর্তনশীল, খুব কমই একটি ভাল ধারণা হবে)।
হারান মানসিকতা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.