স্টাড :: অ্যারের ডিফল্ট সূচনা?


106

সি ++ 11 এর সাথে std::arrayআমার কি গ্যারান্টি আছে যে সিনট্যাক্সটি std::array<T, N> x;অ্যারের সমস্ত উপাদানকে ডিফল্ট-আরম্ভ করবে?

সম্পাদনা : যদি না হয়, এমন একটি সিনট্যাক্স আছে যা সমস্ত অ্যারেগুলিতে (শূন্য আকারের অ্যারে সহ) কাজ করবে যা সমস্ত উপাদানকে তাদের ডিফল্ট মান হিসাবে শুরু করতে পারে?

সম্পাদনা : সিপ্রেফারেন্সে ডিফল্ট নির্মাতার বিবরণ বলে:

(constructor) (implicitly declared) (public member function)
default-constructs or copy-constructs every element of the array 

সুতরাং উত্তর হ্যাঁ হতে পারে। তবে আমি স্ট্যান্ডার্ড বা ভবিষ্যতের মান অনুযায়ী এটি সম্পর্কে নিশ্চিত হতে চাই।


এমন ভাববেন না। এটি ডিফল্ট হিসাবে ঘোষিত তাই এটি মূলত T x[N]বাক্য গঠনের সমতুল্য ।
Rapptz

উত্তর:


151

সংজ্ঞা অনুসারে, ডিফল্ট ইনিশিয়ালাইজেশন হ'ল সূচনা যা ঘটে যখন অন্য কোনও সূচনা নির্দিষ্ট না করা হয়; সি ++ ভাষা আপনাকে গ্যারান্টি দেয় যে আপনি যে কোনও অবজেক্টের জন্য সুস্পষ্ট প্রারম্ভকালীন সরবরাহ করেন না সেটিকে ডিফল্ট আরম্ভ করা হবে (সি ++ 11 §8.5 / 11)। এর মধ্যে টাইপ std::array<T, N>এবং অবজেক্টস অন্তর্ভুক্ত রয়েছে T[N]

সচেতন থাকুন যে কয়েকটি ধরণের জন্য ডিফল্ট সূচনাটির কোনও প্রভাব নেই এবং অবজেক্টের মান অনির্দিষ্টভাবে ছেড়ে যায়: কোনও শ্রেণিবদ্ধ, অ-অ্যারে টাইপ (§8.5 / 6)। ফলস্বরূপ, এই জাতীয় ধরণের অবজেক্টগুলির একটি ডিফল্ট-আরম্ভীকৃত অ্যারের অনির্দিষ্ট মান থাকবে, যেমন:

int plain_int;
int c_style_array[13];
std::array<int, 13> cxx_style_array;

উভয় সি-স্টাইলের অ্যারে এবং std::arrayঅনির্দিষ্ট মানের পূর্ণসংখ্যার সাথে পূর্ণ, যেমন plain_intঅনির্দিষ্ট মান রয়েছে।

এমন একটি বাক্য গঠন আছে যা সমস্ত উপাদানকে তাদের ডিফল্ট মানটিতে আরম্ভ করার জন্য (শূন্য আকারের অ্যারে সহ) কাজ করবে?

আমি অনুমান করছি যে আপনি যখন "তাদের ডিফল্ট মানকে" বলবেন তখন আপনার সত্যিকার অর্থে "সমস্ত উপাদানকে আরম্ভ করে" বোঝানো হবে T{}। এটি ডিফল্ট-আরম্ভ নয় , এটি মান-সূচনা (8.5 / 7)। আপনি প্রতিটি ঘোষণাকে একটি খালি প্রারম্ভিক উপহার দিয়ে সি ++ 11 তে খুব সহজেই মান শুরুর জন্য অনুরোধ করতে পারেন:

int plain_int{};
int c_style_array[13]{};
std::array<int, 13> cxx_style_array{};

যা ঘুরে ঘুরে অ্যারে উপাদানগুলির সমস্তকেই আরম্ভ করবে, ফলস্বরূপ এবং plain_old_intউভয় ধরণের অ্যারেগুলির সমস্ত সদস্যকে শূন্যের দিকে আরম্ভ করা হবে।


এটি কোনও শ্রেণীর সদস্য হলে কী হবে: কাঠামো এক্স {স্টাড :: অ্যারে <<, 12> ডজন; এক্স (): ডজন () {that এটি কি আমাকে বারো জিরো পেয়েছে?
gerardw

4
@ জেরার্ডউ মানক অনুসারে, হ্যাঁ তা করে। এমএসভিসিতে বাগ সাবধান, এটি মান শুরুর কিছু ক্ষেত্রে সঠিকভাবে প্রয়োগ করতে ব্যর্থ।
কেসি

4
প্রকৃতপক্ষে বুস্ট তাই বলছেন এবং তাদের সঙ্গে এটি কার্যসংক্রান্ত boost::value_initialized লিংক কিন্তু আমি মনে করি VC12 (VS2013) এখন অনেক ভালো সমর্থন আছে।
v.oddou

4
আমাকে কামনা করে যে কামিয়েটি অনুরোধের ভিত্তিতে মানটিকে ডিফল্ট মান-আরম্ভকরণ এবং নিম্নমানের মান হিসাবে পরিবর্তন করেছে। অর্থাৎ স্টাড :: অ্যারে <int, 12> = {স্টাড :: নির্ধারিত}; বা কিছু
ভিক্টর সেহর

অনুশীলনে এমনকি এটি অনির্দিষ্ট মান থেকে কিছু শুরু করার অর্থ কী? বিকল্প কি?
অ্যান্ড্রু

23

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

Cppreferences.com এ বর্ণনাটি আসলে কিছুটা বিভ্রান্তিকর। std::arrayএকটি সামগ্রিক শ্রেণি, এবং যদি উপাদান টাইপ আদিম হয়, তবে এটি পিওডি: সিটি ভাষার সাথে মিল রেখে শব্দার্থবিজ্ঞানের সাথে "প্লেইন পুরাতন ডেটা"। সুস্পষ্টভাবে সংজ্ঞায়িত নির্মাতা std::array< int, N >একটি তুচ্ছ একটি যা একেবারে কিছুই করে না।

সিনট্যাক্সের মতো std::array< int, 3 >()বা std::array< int, 3 > x{}যা শূন্য মানগুলি সরবরাহ করে তা কোনও কনস্ট্রাক্টরকে অনুরোধ করে তা করে না। জিরো পাওয়া মান + শুরুর অংশ , যা C ++ 11 §8.5 / 8 এ নির্দিষ্ট করা হয়েছে:

টাইপ টির একটি অবজেক্টের মূল্য-সূচনা করার জন্য:

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

std::arrayকোনও ব্যবহারকারীর সরবরাহিত ডিফল্ট কনস্ট্রাক্টর নেই, তাই এটি শূন্য-আরম্ভ হয়। এটিতে একটি স্পষ্টভাবে সংজ্ঞায়িত ডিফল্ট নির্মাণকারী রয়েছে তবে এটি তুচ্ছ, সুতরাং এটি কখনই ডিফল্ট-আরম্ভ হয় না। (তবে এটি কোনও তাত্পর্যপূর্ণ হয় না কারণ সংজ্ঞা অনুসারে তুচ্ছ সূচনাটি রানটাইমের সময় কোনও প্রভাব ফেলে না))

যদি তা না হয় তবে এমন একটি বাক্য গঠন আছে যা সমস্ত অ্যারেগুলিতে (শূন্য-আকারের অ্যারে সহ) কাজ করবে যা সমস্ত উপাদানকে তাদের ডিফল্ট মান হিসাবে শুরু করতে পারে?

সি-স্টাইলের অ্যারে এবং std::arrayউভয়ই সমষ্টি এবং কোনও সামগ্রিককে সম্পূর্ণ শূন্য-আরম্ভ করার উপায়টি সিনট্যাক্স সহ = {}। এটি সি ++ 98 এর পরে কাজ করে। নোট করুন যে সি স্টাইলের অ্যারেগুলির শূন্য পরিমাণ থাকতে পারে না এবং এটি sizeof (std::array< X, 0 >)শূন্য নয়।


6

উভয় T x[N];এবং std::array<T, N> x;অ্যারের প্রতিটি উপাদান ডিফল্ট-আরম্ভ।

উদাহরণস্বরূপ, যদি T = std::string, প্রতিটি উপাদান একটি খালি স্ট্রিং হবে। যদি Tকোনও ডিফল্ট নির্মাতা ছাড়াই শ্রেণি হয় তবে উভয়ই সংকলন করতে ব্যর্থ হবে। যদি T = int, প্রতিটি উপাদানটির অনির্দিষ্ট মান থাকবে (যদি না যে ঘোষণাটি নামপথের স্কোপে থাকে না)


0

প্রথমত, টি এক্স [এন] উপাদানগুলিকে ডিফল্টরূপে আরম্ভ করে, যদিও স্কেলার টাইপ টির ডিফল্ট সূচনাটি কিছুই করে না। উপরেরটি স্টাড :: অ্যারে এক্স এর জন্যও ধারণ করে। আমি মনে করি আপনার যা প্রয়োজন তা হল তালিকার সূচনা।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.