কনস্ট্যান্ট অবজেক্টের ডিফল্ট-কনস্ট্রাক্ট করার জন্য কেন সি ++ ব্যবহারকারীর সরবরাহিত ডিফল্ট কনস্ট্রাক্টরের প্রয়োজন?


99

সি ++ স্ট্যান্ডার্ড (বিভাগ 8.5) বলেছেন:

যদি কোনও প্রোগ্রাম কোনও কনস্ট-কোয়ালিফাইড টাইপ টি এর কোনও অবজেক্টের ডিফল্ট সূচনা করার জন্য ডাকে, টি ব্যবহারকারীর দ্বারা সরবরাহিত ডিফল্ট কনস্ট্রাক্টরের সাথে শ্রেণীর ধরণ হবে।

কেন? এক্ষেত্রে কোনও ব্যবহারকারী-সরবরাহকারী কনস্ট্রাক্টরের প্রয়োজনীয়তার কোনও কারণ আমি ভাবতে পারি না।

struct B{
  B():x(42){}
  int doSomeStuff() const{return x;}
  int x;
};

struct A{
  A(){}//other than "because the standard says so", why is this line required?

  B b;//not required for this example, just to illustrate
      //how this situation isn't totally useless
};

int main(){
  const A a;
}

4
লাইন আপনার উদাহরণ (দেখুন প্রয়োজন হবে বলে মনে হচ্ছে না ideone.com/qqiXR ) কারণ আপনার ঘোষিত কিন্তু সংজ্ঞায়িত করা হয়নি / আরম্ভ a, কিন্তু জিসিসি-4.3.4 এটিকে স্বীকার এমনকি যখন আপনি (দেখতে পাচ্ছ ideone.com/uHvFS )
রায় তোয়াল

উভয়ের উপরে উদাহরণ ঘোষণা করে এবং সংজ্ঞায়িত করে a। Comeau একটি ত্রুটি তৈরি করে "কনট ভেরিয়েবল" ক "এর জন্য একটি প্রারম্ভকালীন প্রয়োজন - শ্রেণি" এ "এর কোনও স্পষ্টরূপে ঘোষিত ডিফল্ট নির্মাণকারী নেই" যদি লাইনটি মন্তব্য করা হয়।
করু


4
এটি সি ++ 11 এ স্থির করা হয়েছে, আপনি লিখতে পারেন const A a{}:)
হাওয়ার্ড লোভ্যাট

উত্তর:


10

এটি একটি ত্রুটি হিসাবে বিবেচিত হয়েছিল (স্ট্যান্ডার্ডের সমস্ত সংস্করণের বিপরীতে) এবং এটি কোর ওয়ার্কিং গ্রুপ (সিডাব্লুজি) ত্রুটি 253 দ্বারা সমাধান করা হয়েছিল । Http://eel.is/c++ftftdd.in.init7 স্ট্যান্ডার্ড রাজ্যের জন্য নতুন শব্দগঠন

একটি শ্রেণীর টাইপ টি কনস্ট-ডিফল্ট-গঠনযোগ্য যদি টি এর ডিফল্ট-ইনিশিয়েশনটি কোনও ব্যবহারকারী-সরবরাহকারী কনস্ট্রাক্টরকে (বেস শ্রেণীর কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় না) অনুরোধ করে বা যদি

  • টি এর প্রতিটি প্রত্যক্ষ নন-ভেরিয়েন্ট নন-স্ট্যাটিক ডেটা মেম্বারের ডিফল্ট সদস্য ইনিশিয়ালাইজার থাকে বা, এম যদি ক্লাস টাইপের এক্স (বা এর অ্যারে) হয় তবে এক্স কনস্ট-ডিফল্ট-গঠনমূলক,
  • যদি টি কমপক্ষে একটি অ স্থিতিশীল ডেটা সদস্যের সাথে একটি ইউনিয়ন হয়, ঠিক একটি বৈকল্পিক সদস্যের একটি ডিফল্ট সদস্য আরম্ভকারী থাকে,
  • যদি টি ইউনিয়ন না হয়, প্রতিটি বেনাম ইউনিয়ন সদস্যের জন্য কমপক্ষে একটি অ স্থিতিশীল ডেটা সদস্যের (যদি থাকে), ঠিক একটি অ স্থির ডেটা সদস্যের ডিফল্ট সদস্য আরম্ভকারী থাকে এবং
  • টি এর প্রতিটি সম্ভাব্য নির্মিত বেস ক্লাস কনস্ট-ডিফল্ট-গঠনমূলক।

যদি কোনও প্রোগ্রাম কোনও কনস্ট-কোয়ালিফাইড টাইপ টি এর কোনও অবজেক্টের ডিফল্ট-আরম্ভকরণের জন্য ডাকে, টি অবশ্যই কনস্ট-ডিফল্ট-গঠনমূলক শ্রেণীর ধরণ বা এরে হবে।

এই শব্দের মূলত বোঝা যাচ্ছে যে সুস্পষ্ট কোডটি কাজ করে। আপনি যদি আপনার সমস্ত ঘাঁটি এবং সদস্যদের সূচনা করেন A const a;তবে আপনি কোনও নির্মাণকারীকে কীভাবে বা বানান বানান নির্বিশেষে বলতে পারেন।

struct A {
};
A const a;

জিসিসি এটি 4.6.4 থেকে গ্রহণ করেছে। ঝাঁকুনি এটি 3.9.0 থেকে গ্রহণ করেছে। ভিজ্যুয়াল স্টুডিওও এটি গ্রহণ করে (কমপক্ষে 2017 এ, তাড়াতাড়ি নিশ্চিত কিনা)।


4
তবে এটি struct A { int n; A() = default; }; const A a;অনুমতি দেওয়ার সময় এখনও নিষেধ করেছে struct B { int n; B() {} }; const B b;কারণ নতুন শব্দটিতে এখনও "ব্যবহারকারী দ্বারা প্রদত্ত" "ব্যবহারকারী-ঘোষিত" নয় এবং কেন আমি কমিটি এই ডিআর থেকে স্পষ্টতই খেলাপি ডিফল্ট কনস্ট্রাক্টরকে বাদ দিতে চেয়েছিল, তা তৈরি করতে বাধ্য করেছিলাম বলে আমার মাথা আঁচড়ানো যাচ্ছে us আমাদের ক্লাসগুলি অ-তুচ্ছ যদি আমরা অবিচ্ছিন্ন সদস্যদের সাথে কনট অবজেক্টগুলি চাই want
Oktalist

4
আকর্ষণীয়, তবে এমন একটি ধার-কেস এখনও রয়েছে যা আমি প্রবেশ করেছি। সঙ্গে MyPODএকটি শুঁটি হচ্ছে struct, static MyPOD x;- জিরো-আরম্ভের উপর নির্ভর সদস্য ভেরিয়েবলের (গুলি) উপযুক্তভাবে সেট করতে (? সঠিক যে) - প্রনয়ন কিন্তু static const MyPOD x;না। এমন কোনও সুযোগ আছে যে তা স্থির হয়ে যাবে?
জোশুয়া সবুজ

66

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

struct POD
{
  int i;
};

POD p1; //uninitialized - but don't worry we can assign some value later on!
p1.i = 10; //assign some value later on!

POD p2 = POD(); //initialized

const POD p3 = POD(); //initialized 

const POD p4; //uninitialized  - error - as we cannot change it later on!

তবে আপনি যদি ক্লাসটিকে একটি নন-পিওড করেন:

struct nonPOD_A
{
    nonPOD_A() {} //this makes non-POD
};

nonPOD_A a1; //initialized 
const nonPOD_A a2; //initialized 

POD এবং নন-পডের মধ্যে পার্থক্যটি নোট করুন।

ব্যবহারকারী-সংজ্ঞায়িত কনস্ট্রাক্টর ক্লাসকে নন-পিওডি করার একটি উপায়। আপনি এটি করতে পারেন বিভিন্ন উপায়।

struct nonPOD_B
{
    virtual void f() {} //virtual function make it non-POD
};

nonPOD_B b1; //initialized 
const nonPOD_B b2; //initialized 

লক্ষ্য করুন ননপোড_বি ব্যবহারকারী-সংজ্ঞায়িত নির্মাণকারীর সংজ্ঞা দেয় না। এটি সংকলন। এটি সংকলন করবে:

এবং ভার্চুয়াল ফাংশন মন্তব্য করুন, তারপরে এটি ত্রুটি দেয়, যেমনটি প্রত্যাশিত:


ঠিক আছে, আমি মনে করি, আপনি উত্তরণকে ভুল বুঝেছিলেন। এটি প্রথম এটি বলে (§8.5 / 9):

যদি কোনও বস্তুর জন্য কোনও আরম্ভকারী নির্দিষ্ট করা না থাকে এবং অবজেক্টটি (সম্ভবত সিভি-যোগ্যতাসম্পন্ন) নন-পিওডি শ্রেণীর ধরণের (বা এর অ্যারে) হয় তবে অবজেক্টটি ডিফল্ট-আরম্ভ হবে; [...]

এটি নন-পিওডি ক্লাসটি সম্ভবত সিভি-কোয়ালিফাইড টাইপ সম্পর্কে কথা বলে। অর্থাত্, যদি কোনও প্রাথমিক নির্দেশক নির্দিষ্ট না থাকে তবে নন-পিওডি অবজেক্টটি ডিফল্ট-আরম্ভ হবে। এবং ডিফল্ট-আরম্ভ কি? নন-পিওডি-র জন্য, অনুমানগুলি (.58.5 / 5) বলে,

টাইপ টির কোনও অবজেক্টের ডিফল্ট-আরম্ভ করার জন্য:
- টি যদি টি-পি-ওডি ক্লাসের ধরণ (ধারা 9) হয় তবে টির জন্য ডিফল্ট কনস্ট্রাক্টর বলা হয় (এবং টি যদি অ্যাক্সেসযোগ্য ডিফল্ট কনস্ট্রাক্টর না থাকে তবে ইনিশিয়েশনটি খারাপ-গঠিত হয়);

এটি কেবল টির ডিফল্ট নির্মাতা সম্পর্কে আলোচনা করে , এর ব্যবহারকারী সংজ্ঞায়িত বা সংকলক উত্পাদিত অপ্রাসঙ্গিক কিনা।

যদি আপনি এটি পরিষ্কার করে থাকেন তবে অনুমান করুন পরবর্তীটি কী বলে ((§8.5 / 9),

[...]; যদি অবজেক্টটি কনস্ট-কোয়ালিফাইড টাইপের হয় তবে অন্তর্নিহিত বর্গের ধরণটিতে একটি ব্যবহারকারী-ঘোষিত ডিফল্ট কনস্ট্রাক্টর থাকবে।

সুতরাং এই পাঠ্যটি ইঙ্গিত করে, যদি বিষয়টি কনস্ট- কোয়ালিটিড পিওডি টাইপের হয় এবং প্রোগ্রামটির কোনও প্রাথমিক নির্দেশক নির্দিষ্ট না করা থাকে (কারণ পিওডি ডিফল্ট আরম্ভ নয়):

POD p1; //uninitialized - can be useful - hence allowed
const POD p2; //uninitialized - never useful  - hence not allowed - error

যাইহোক, এটি জরিমানা সংকলন করে কারণ এর নন-পিওডি, এবং এটি ডিফল্ট-আরম্ভ করা যেতে পারে ।


4
আমি বিশ্বাস করি যে আপনার শেষ উদাহরণটি একটি সংকলন ত্রুটি - এতে nonPOD_Bকোনও ব্যবহারকারী-সরবরাহিত ডিফল্ট কনস্ট্রাক্টর নেই তাই লাইনটি const nonPOD_B b2অনুমোদিত নয়।
করু

4
শ্রেণিটিকে নন-পিওড বানানোর আরেকটি উপায় হ'ল এটি একটি ডেটা সদস্য দেওয়া যা কোনও পিওডি নয় (যেমন B, প্রশ্নে আমার কাঠামো )। তবে ব্যবহারকারীর দ্বারা সরবরাহিত ডিফল্ট কনস্ট্রাক্টর এখনও সেই ক্ষেত্রে প্রয়োজন।
করু

"যদি কোনও প্রোগ্রাম কোনও কনস্ট-কোয়ালিফাইড টাইপ টি এর কোনও অবজেক্টের ডিফল্ট সূচনা করার জন্য ডাকে, টি ব্যবহারকারীর দ্বারা সরবরাহিত ডিফল্ট কনস্ট্রাক্টরের সাথে ক্লাসের ধরণ হবে" "
করু

@ কারু: আমি তা পড়েছি। মনে হয় স্পেকের অন্যান্য প্যাসেজ রয়েছে, যা constনন-পিওডি অবজেক্টটি সংকলক দ্বারা উত্পাদিত ডিফল্ট-কনস্ট্রাক্টরকে কল করে আরম্ভ করতে দেয় ।
নওয়াজ

4
আপনার আদর্শ লিঙ্কগুলি নষ্ট হয়ে গেছে বলে মনে হচ্ছে এবং এটি উত্তম হবে যদি উত্তরটি সি ++ 11/14 এ আপডেট করা যায় কারণ §8.5 পিওডি-তে মোটেও উল্লেখ করে না।
Oktalist

12

আমার পক্ষে খাঁটি জল্পনা, তবে বিবেচনা করুন যে অন্যান্য ধরণেরও একইরকম সীমাবদ্ধতা রয়েছে:

int main()
{
    const int i; // invalid
}

সুতরাং কেবল এই নিয়মটিই ধারাবাহিক নয়, তবে এটি (পুনরাবৃত্তভাবে) এককীকরণ const(উপ) অবজেক্টগুলিও প্রতিরোধ করে:

struct X {
    int j;
};
struct A {
    int i;
    X x;
}

int main()
{
    const A a; // a.i and a.x.j in unitialized states!
}

প্রশ্নের অন্য দিকের হিসাবে (এটি একটি ডিফল্ট কনস্ট্রাক্টর সহ প্রকারের জন্য মঞ্জুরি দেওয়া) আমি মনে করি যে এই ধারণাটি যে ব্যবহারকারী-সরবরাহিত ডিফল্ট কনস্ট্রাক্টর সহ একটি ধরণের নির্মাণের পরে সর্বদা কিছুটা বোধগম্য অবস্থায় থাকার কথা। মনে রাখবেন যে বিধিগুলি নিম্নলিখিত হিসাবে তাদের মঞ্জুরিপ্রাপ্ত:

struct A {
    explicit
    A(int i): initialized(true), i(i) {} // valued constructor

    A(): initialized(false) {}

    bool initialized;
    int i;
};

const A a; // class invariant set up for the object
           // yet we didn't pay the cost of initializing a.i

তারপরে সম্ভবত আমরা একটি নিয়ম তৈরি করতে পারি যেমন 'একজন ব্যবহারকারী-সরবরাহিত ডিফল্ট কনস্ট্রাক্টারে কমপক্ষে একজন সদস্যকে বোধগম্যভাবে ইনিশিয়েল করাতে হবে', তবে মার্ফির বিরুদ্ধে সুরক্ষার চেষ্টা করতে খুব বেশি সময় ব্যয় হয়েছিল। সি ++ নির্দিষ্ট পয়েন্টগুলিতে প্রোগ্রামারকে বিশ্বাস করে।


তবে যুক্ত করে A(){}, ত্রুটিটি চলে যাবে, তাই এটি কোনও কিছুই রোধ করে না। নিয়মটি পুনরাবৃত্তভাবে কাজ করে না - X(){}উদাহরণের জন্য কখনই প্রয়োজন হয় না।
কারু

4
ওয়েল, অন্তত একটি কন্সট্রাকটর যোগ করার জন্য প্রোগ্রামার অত্যাচার, তিনি সমস্যার একটি মিনিট ভাবনা দিতে এবং হয়ত একটি অ-তুচ্ছ এক সঙ্গে আসা পর্যন্ত করতে বাধ্য হয়
Arne

@ কারু আমি কেবলমাত্র অর্ধেক প্রশ্নের উত্তর দিয়েছি - তা ঠিক করে দিয়েছে :)
ড্যান্টন

4
@ আর্ন: একমাত্র সমস্যা হ'ল এটিই ভুল প্রোগ্রামার। যে ব্যক্তি ক্লাসটি ইনস্ট্যান্ট করার চেষ্টা করছে সে বিষয়টি সম্পর্কে তার মনে সমস্ত চিন্তাভাবনা দিতে পারে তবে তারা ক্লাসটি সংশোধন করতে সক্ষম হতে পারে না। শ্রেণি লেখক সদস্যদের সম্পর্কে চিন্তাভাবনা করেছিলেন, দেখেছিলেন যে তারা সকলেই সংবেদনশীলরূপে অন্তর্ভুক্ত ডিফল্ট নির্মাতা দ্বারা সূচিত হয়েছিল, তাই কখনও কোনও যোগ করেন নি।
করু

4
স্ট্যান্ডার্ডের এই অংশটি থেকে আমি যা নিয়েছি তা হ'ল "সর্বদা পিওডি নন প্রকারের জন্য একটি ডিফল্ট কনস্ট্রাক্টর হিসাবে সর্বদা ঘোষণা করুন, যদি কেউ একদিন কোনও কনস্ট্যান্ট উদাহরণ তৈরি করতে চায়"। এটি কিছুটা ওভারকিল বলে মনে হচ্ছে।
করু

3

আমি মিটিং সি ++ 2018 তে তৈমুর ডমলারের বক্তব্যটি দেখছিলাম এবং অবশেষে আমি বুঝতে পেরেছিলাম কেন স্ট্যান্ডার্ডটির জন্য এখানে কেবলমাত্র কোনও ব্যবহারকারী-ঘোষিত নয়, একজন ব্যবহারকারী-সরবরাহকারীর প্রয়োজন। এটি মান আরম্ভের জন্য নিয়ম সঙ্গে করতে হবে।

দুটি শ্রেণি বিবেচনা করুন: Aএকটি ব্যবহারকারী-ঘোষিত কনস্ট্রাক্টর রয়েছে, Bএকটি ব্যবহারকারী-সরবরাহকারী কনস্ট্রাক্টর রয়েছে:

struct A {
    int x;
    A() = default;
};
struct B {
    int x;
    B() {}
};

প্রথম নজরে, আপনি ভাবতে পারেন যে এই দুটি কনস্ট্রাক্টর একই আচরণ করবে। তবে দেখুন কীভাবে প্রাথমিক সূচনাটি আলাদাভাবে আচরণ করে, যখন কেবলমাত্র ডিফল্ট ইনিশিয়েশন একই আচরণ করে:

  • A a;এটি ডিফল্ট সূচনা: সদস্য int xঅবিচ্ছিন্ন।
  • B b;এটি ডিফল্ট সূচনা: সদস্য int xঅবিচ্ছিন্ন।
  • A a{};মান initialisation হল: সদস্য int xকরা হয় শূন্য ইনিশিয়ালাইজ
  • B b{};মান সূচনা হয়: সদস্য int xঅবিচ্ছিন্ন হয়।

এখন দেখুন যখন আমরা যুক্ত করি তখন কী হয় const:

  • const A a;এটি ডিফল্ট সূচনা: প্রশ্নটিতে উদ্ধৃত হওয়া নিয়মের কারণে এটি খারাপ-গঠন ill
  • const B b;এটি ডিফল্ট সূচনা: সদস্য int xঅবিচ্ছিন্ন।
  • const A a{};মান initialisation হল: সদস্য int xকরা হয় শূন্য ইনিশিয়ালাইজ
  • const B b{};মান সূচনা হয়: সদস্য int xঅবিচ্ছিন্ন হয়।

একটি অবিচ্ছিন্ন constস্কেলার (উদাঃ int xসদস্য) অকেজো হবে: এটিকে লেখার বিষয়টি গঠনমূলক (কারণ এটি const) এবং এটি থেকে পড়া ইউবি (কারণ এটি একটি অনির্দিষ্ট মান রাখে)। তাই এই নিয়ম আপনি এই ধরনের একটা জিনিস তৈরি করার সময়, আপনি অত্যাচার দ্বারা করা থেকে আটকায় পারেন একটি initialiser যোগ বা ব্যবহারকারী-প্রদান করা কন্সট্রাকটর যোগ করে নির্বাচন বিপজ্জনক আচরণ করতে।

আমি মনে করি [[uninitialized]]আপনি যখন ইচ্ছাকৃতভাবে কোনও জিনিস আরম্ভ করছেন না তখন সংকলককে বলার মতো একটি বৈশিষ্ট্য থাকা ভাল হবে nice তারপরে এই কোণার কেসটি ঘটার জন্য আমরা আমাদের শ্রেণিকে তুচ্ছভাবে ডিফল্টকে গঠনমূলক না করতে বাধ্য করব না। এই অ্যাট্রিবিউটটি আসলে প্রস্তাব করা হয়েছে , তবে অন্য সমস্ত স্ট্যান্ডার্ড বৈশিষ্ট্যের মতো এটি কোনও সংকীর্ণ আচরণকে বাধ্যতামূলক করে না, সংকলককে কেবল ইঙ্গিত হিসাবে দেখায়।


1

অভিনন্দন, আপনি এমন একটি উদ্ভাবন করেছেন যাতে constঘোষণার জন্য কোনও ব্যবহারকারীর সংজ্ঞায়িত নির্মাণকারীর দরকার নেই, যার অর্থ কোনও প্রারম্ভিক নয়।

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

আমি প্রতিক্রিয়া জানাই যে এমন একটি নিয়ম নিয়ে আসা যা আপনার ঘোষণাকে সার্থক করে তোলার অনুমতি দেয় যা সত্যই কঠিন এবং নিয়মটি এমনভাবে প্রয়োগ করা যেতে পারে যাতে কোড পড়ার সময় আরও কঠোর হয় sense আমি কিছুটা সীমাবদ্ধ নিয়ম পছন্দ করবো যা বেশিরভাগ ক্ষেত্রে খুব সংকীর্ণ এবং জটিল নিয়ম যা সঠিকভাবে বুঝতে এবং প্রয়োগ করা কঠিন ছিল তা করা সঠিক কাজ।

প্রশ্নটি হচ্ছে, নিয়মটি আরও জটিল হওয়ার কোনও বাধ্যবাধকতা আছে কি? কিছু কোড আছে যা অন্যথায় লিখতে বা বুঝতে খুব কঠিন হবে যে নিয়মটি আরও জটিল হলে আরও বেশি করে লেখা যেতে পারে?


4
এখানে আমার প্রস্তাবিত শব্দবন্ধটি রয়েছে: "যদি কোনও প্রোগ্রাম কনস্ট-কোয়ালিফাইড টাইপ টি এর কোনও অবজেক্টের ডিফল্ট সূচনা করার জন্য ডাকে, টি একটি নন-পিওডি ক্লাসের ধরণ হবে" " এটি const POD x;যেমন অবৈধ ঠিক তেমনি const int x;অবৈধ করে দেবে (যা বোঝায় যে এটি কোনও পিওডের পক্ষে অকেজো), তবে const NonPOD x;আইনী করুন (যা বোঝায়, কারণ এটিতে দরকারী কনস্ট্রাক্টর / ডেস্ট্রাক্টর সম্বলিত সাবওবজেক্ট থাকতে পারে বা নিজেই একটি কার্যকর কনস্ট্রাক্টর / ডেস্ট্রাক্টর থাকতে পারে) ।
করু

@ কারু - এই শব্দটি কার্যকর হতে পারে। আমি আরএফসি স্ট্যান্ডার্ডিজে অভ্যস্ত, এবং তাই মনে হয় যে 'টি হবে' টি টি অবশ্যই পড়তে হবে। তবে হ্যাঁ, এটি কাজ করতে পারে।
সর্বশক্তিমান

@ কারু - স্ট্রাক্ট ননপড সম্পর্কে কী হবে; ভার্চুয়াল অকার্যকর চ () {}}? কনস্ট্যান্ট ননপড এক্স তৈরি করার কোনও অর্থ নেই; আইনী
গ্রুজভেটর

4
@ গ্রুজভোয়েটার আপনার যদি খালি ব্যবহারকারী-ঘোষিত ডিফল্ট নির্মাতা থাকে তবে তা কী আরও বোঝাতে পারে? আমার পরামর্শটি কেবলমাত্র মানের একটি অর্থহীন প্রয়োজনীয়তা অপসারণ করার চেষ্টা করে; এটি সহ বা এটি ছাড়া এখনও অসীমভাবে কোড লেখার অনেকগুলি উপায় রয়েছে যা বোঝা যায় না।
করু

4
@ কারু আমি আপনার সাথে একমত স্ট্যান্ডার্ডে এই নিয়মের কারণে অনেক ক্লাস রয়েছে যা ব্যবহারকারীর দ্বারা নির্ধারিত খালি কনস্ট্রাক্টর থাকতে হবে। আমি জিসিসির আচরণ পছন্দ করি। এটি উদাহরণস্বরূপ অনুমতি struct NonPod { std::string s; }; const NonPod x;দেয় এবং ননপড থাকা অবস্থায় একটি ত্রুটি দেয়struct NonPod { int i; std::string s; }; const NonPod x;
গ্রুজোভেটর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.