কেন অন্তর্নিহিত ভাষাটি প্রাথমিক :: প্রাথমিক ভাষা নয়?


97

std::initializer_listমূল ভাষা অন্তর্নির্মিত নয় কেন ?

এটি আমার কাছে মনে হচ্ছে এটি সি ++ 11 এর বেশ গুরুত্বপূর্ণ একটি বৈশিষ্ট্য এবং এখনও এটির নিজস্ব সংরক্ষিত কীওয়ার্ড নেই (বা এর মতো কিছু)।

পরিবর্তে, initializer_listএটি স্ট্যান্ডার্ড লাইব্রেরি থেকে কেবলমাত্র একটি টেম্পলেট শ্রেণীর নতুন সংযোজক দ্বারা পরিচালিত নতুন ব্রেসড-ডিআইডি-তালিকা সিনট্যাক্স থেকে একটি বিশেষ, অন্তর্নিহিত ম্যাপিং রয়েছে {...}

প্রথম ভাবা, এই সমাধানটি বেশ হ্যাকি

সি ++ ভাষাতে এখন নতুন সংযোজনগুলি কীভাবে প্রয়োগ করা হবে: কিছু টেম্পলেট শ্রেণীর অন্তর্নিহিত ভূমিকা দ্বারা এবং মূল ভাষার দ্বারা নয় ?


দয়া করে এই উদাহরণগুলি বিবেচনা করুন:

   widget<int> w = {1,2,3}; //this is how we want to use a class

কেন নতুন ক্লাস বেছে নেওয়া হয়েছিল:

   widget( std::initializer_list<T> init )

এর পরিবর্তে এগুলির কোনও ধারণার অনুরূপ কিছু ব্যবহার করার জন্য:

   widget( T[] init, int length )  // (1)
   widget( T... init )             // (2)
   widget( std::vector<T> init )   // (3)
  1. একটি ক্লাসিক অ্যারে, আপনি সম্ভবত constএখানে এবং সেখানে যোগ করতে পারেন
  2. তিনটি বিন্দু ভাষাতে ইতিমধ্যে বিদ্যমান (ভের-আরগস, এখন বৈকল্পিক টেম্পলেট) কেন সিনট্যাক্সটি পুনরায় ব্যবহার করবেন না (এবং এটিকে অন্তর্নির্মিত বোধ করছেন )
  3. কেবল একটি বিদ্যমান পাত্রে, যোগ করতে পারে constএবং&

এঁরা সকলেই ইতিমধ্যে ভাষার একটি অঙ্গ। আমি কেবল আমার 3 টি প্রথম ধারণা লিখেছি, আমি নিশ্চিত যে আরও অনেকগুলি পন্থা রয়েছে।


26
স্ট্যান্ডার্ড কমিটি নতুন কীওয়ার্ড যুক্ত করে ঘৃণা করে!
অ্যালেক্স চেম্বারলাইন

11
এটি আমি বুঝতে পেরেছি, তবে ভাষা কীভাবে প্রসারিত করা যায় তার অনেকগুলি সম্ভাবনা রয়েছে ( কীওয়ার্ডটি কেবল একটি উদাহরণ ছিল )
এমেসেক্স

10
std::array<T>এর চেয়ে 'ভাষার অংশ' আর নেই std::initializer_list<T>। এবং এগুলি প্রায় একমাত্র গ্রন্থাগারের উপাদান নয় যা ভাষার উপর নির্ভর করে। দেখুন new/ delete,, type_infoবিভিন্ন ব্যতিক্রম size_t, ইত্যাদি।
bames53

6
@ এলমস: আমি পরামর্শ দিতাম const T(*)[N], কারণ এটি কীভাবে std::initializer_listকাজ করে তার সাথে খুব একই রকম আচরণ করে।
মাকিং হাঁস

4
এই উত্তরগুলি কেন std::arrayবা একটি স্ট্যাটিকালি আকারের অ্যারে কম পছন্দসই বিকল্প।
বালক

উত্তর:


48

ইতিমধ্যে "মূল" ভাষার বৈশিষ্ট্যগুলির উদাহরণ রয়েছে যা stdনামস্থানে সংজ্ঞায়িত প্রকারগুলি প্রত্যাবর্তন করে । typeidফিরে আসে std::type_infoএবং (সম্ভবত একটি পয়েন্ট প্রসারিত) sizeofফিরে আসে std::size_t

পূর্ববর্তী ক্ষেত্রে, এই তথাকথিত "মূল ভাষা" বৈশিষ্ট্যটি ব্যবহার করার জন্য আপনাকে ইতিমধ্যে একটি মানক শিরোনাম অন্তর্ভুক্ত করতে হবে।

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

সুতরাং হ্যাঁ, আপনি সম্ভবত ভবিষ্যতে এই নকশা নীতিটি আরও আশা করতে পারেন:

  • যদি আরও ইভেন্টগুলি দেখা দেয় যেখানে নতুন কীওয়ার্ড ছাড়াই নতুন বৈশিষ্ট্যগুলি প্রবর্তন করা সম্ভব হয় তবে কমিটি সেগুলি গ্রহণ করবে।
  • যদি নতুন বৈশিষ্ট্যগুলির জন্য জটিল ধরণের প্রয়োজন হয়, তবে সেই stdধরণেরগুলি বিল্টিনের পরিবর্তে স্থাপন করা হবে ।

সুতরাং:

  • যদি কোনও নতুন বৈশিষ্ট্যের জন্য জটিল ধরণের প্রয়োজন হয় এবং নতুন কীওয়ার্ড ব্যতীত পরিচয় করানো যায় তবে আপনার এখানে যা আছে তা "মূল ভাষা" সিনট্যাক্স ছাড়া কোনও নতুন কীওয়ার্ড নেই এবং এটি থেকে গ্রন্থাগারের প্রকারের ব্যবহার রয়েছে std

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

সি ++ 11 এ অন্য পদ্ধতি রয়েছে, যা হ'ল লম্বডাস এমন অবজেক্টগুলি প্রবর্তন করে যা সংকলক দ্বারা বেনামে প্রকারের তৈরি করা হয়েছে। কারণ তাদের কোনও নাম নেই কারণ তারা মোটেও কোনও নামস্থানে নেই, অবশ্যই তা নয় std। এটি আরম্ভকারী তালিকার জন্য উপযুক্ত পদ্ধতির নয়, যদিও আপনি নির্মাণকারীর লেখার সময় টাইপ নামটি ব্যবহার করেন যা কোনও গ্রহণযোগ্য।


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

4
... অথবা এটা সহজ কারণে যে আপনি একটি কন্সট্রাকটর লিখেছেন হতে পারে vectorযে সময় লাগে একটি arrayতারপর আপনি একটি ভেক্টর থেকে গঠন করা হতে পারে কোন সঠিক প্রকারের অ্যারে, শুধু একটা সূচনাকারী তালিকা সিনট্যাক্স দ্বারা উত্পন্ন না। আমি নিশ্চিত নই যে কারও কাছ থেকে পাত্রে নির্মাণ করা খারাপ কাজ হবে array, তবে নতুন সিনট্যাক্সটি প্রবর্তন করা কমিটির উদ্দেশ্য নয়।
স্টিভ জেসোপ

4
@ ক্রিশ্চিয়ান: না, std::arrayএমনকি কোনও নির্মাণকারীও নেই। std::arrayকেস কেবল সমষ্টিগত-আরম্ভের হয়। এছাড়াও, আমি আপনাকে লাউঞ্জ <সি ++> চ্যাট রুমে যোগদানের জন্য আপনাকে স্বাগত জানাই, কারণ এই আলোচনাটি খানিকটা দীর্ঘ হচ্ছে getting
Xoo

4
@ ক্রিশ্চিয়ানআরও: জিসো মানে ইনিশিয়ালার তালিকাটি তৈরি করা হলে উপাদানগুলি অনুলিপি করা হয়। প্রারম্ভিক তালিকাটি অনুলিপি করা উপাদানগুলিকে অনুলিপি করে না।
মাকিং হাঁস

4
@ ক্রিশ্চিয়ান তালিকা-ইনিশিয়ালাইজেশন ইনিশিয়ালাইজার তালিকাটি বোঝায় না। এটি ভাল ওলে ডাইরেক্ট-ইনিশিয়ালাইজেশন বা সামগ্রিক সূচনা সহ অনেকগুলি জিনিস হতে পারে। এগুলির কোনওটিই জেনারেটরাইজার_লিস্টের সাথে জড়িত নয় (এবং কিছু কিছু কেবল সেভাবে কাজ করতে পারে না )।
আর মার্টিনহো ফার্নান্দিস

42

সি ++ স্ট্যান্ডার্ড কমিটি নতুন কীওয়ার্ডগুলি যুক্ত না করা পছন্দ করে বলে মনে হচ্ছে, সম্ভবত এটি বিদ্যমান কোড ভাঙার ঝুঁকি বাড়ায় (লিগ্যাসি কোডটি সেই কীওয়ার্ডটি একটি ভেরিয়েবল, শ্রেণি বা অন্য যে কোনও কিছু হিসাবে ব্যবহার করতে পারে)।

তদুপরি, এটি আমার কাছে মনে হয় যে std::initializer_listএকটি টেম্প্লেটেড কনটেইনার হিসাবে সংজ্ঞায়িত করা বেশ মার্জিত পছন্দ: এটি যদি একটি কীওয়ার্ড হয় তবে আপনি কীভাবে এর অন্তর্নিহিত ধরণের অ্যাক্সেস করবেন? কিভাবে আপনি এটি মাধ্যমে পুনরাবৃত্তি হবে? আপনার পাশাপাশি নতুন অপারেটরগুলির একটি গুচ্ছ প্রয়োজন হবে এবং এটি আপনাকে স্ট্যান্ডার্ড পাত্রে যে কাজগুলি করতে পারে তা করতে আরও নাম এবং আরও কীওয়ার্ড মনে রাখতে বাধ্য করবে।

std::initializer_listঅন্য কোনও ধারক হিসাবে চিকিত্সা আপনাকে জেনেরিক কোড লেখার সুযোগ দেয় যা এইগুলির কোনওটির সাথে কাজ করে।

হালনাগাদ:

তারপরে বিদ্যমান কিছু সংমিশ্রণ ব্যবহার না করে কেন নতুন ধরণের প্রবর্তন করবেন? (মন্তব্যগুলি থেকে)

শুরুতে, অন্য সমস্ত পাত্রে উপাদান যুক্ত করার, অপসারণ এবং সম্প্রসারণের জন্য পদ্ধতি রয়েছে, যা সংকলক-উত্পন্ন সংগ্রহের জন্য কাম্য নয়। একমাত্র ব্যতিক্রম হ'ল std::array<>, যা একটি নির্দিষ্ট আকারের সি-স্টাইলের অ্যারেটি আবৃত করে এবং কেবলমাত্র যুক্তিসঙ্গত প্রার্থীই থেকে যায়।

তবে নিকোল Bolas সঠিকভাবে মন্তব্য তুলে ধরে মধ্যে অন্য, মৌলিক পার্থক্য std::initializer_listএবং অন্যান্য মান পাত্রে (তত্সহ std::array<>) যে আধুনিক বেশী আছে মূল্য শব্দার্থবিদ্যা , যখন std::initializer_listহয়েছে রেফারেন্স শব্দার্থবিদ্যা । একটি অনুলিপি std::initializer_list, উদাহরণস্বরূপ, উপাদান এটা রয়েছে একটি কপি করতে পারবে না।

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


4
তারপরে বিদ্যমান কিছু সংমিশ্রণ ব্যবহার না করে কেন নতুন ধরণের প্রবর্তন করবেন?
এমেসেক্স

4
@ এলমেস: আসলে এটি আরও বেশি পছন্দ std::array। কিন্তু std::arrayবরাদ্দ মেমরির যখন std::initializaer_listগোপন একটি কম্পাইল-টাইম অ্যারে। মধ্যে পার্থক্য হিসাবে মনে করে char s[] = "array";এবং char *s = "initializer_list";
রডরিগো

4
এবং এটি সাধারণ ধরণের হয়ে ওভারলোডিং, টেমপ্লেট বিশেষায়িতকরণ, নাম-সজ্জা এবং এর মতো নন-ইস্যু করে।
রডরিগো

4
@ প্রড্রিগো: std::arrayকোনও মেমরি বরাদ্দ দেয় না, এটি একটি সমতল T arr[N];, একই জিনিস যা সমর্থন করছে std::initializer_list
জিও

6
@Xeo: T arr[N] বরাদ্দ করে মেমরি, গতিশীল গাদা মধ্যে হয়তো না কিন্তু অন্যত্র ... সুতরাং করে std::array। তবে একটি খালি খালি initializer_listব্যবহারকারীর দ্বারা নির্মাণ করা যায় না তাই এটি স্পষ্টতই মেমরি বরাদ্দ করতে পারে না।
রডরিগো

6

এটি নতুন কিছু নয়। উদাহরণস্বরূপ, for (i : some_container)উপর নির্ভর করে নির্দিষ্ট পদ্ধতি বা স্বতন্ত্র ফাংশন অস্তিত্ব মধ্যে some_containerবর্গ। সি # এমনকি এর NET লাইব্রেরিগুলিতে আরও বেশি নির্ভর করে। প্রকৃতপক্ষে, আমি মনে করি, এটি বেশ মার্জিত সমাধান, কারণ আপনি ভাষা শ্রেণিবদ্ধকরণ জটিল না করেই আপনার ক্লাসগুলি কিছু ভাষার কাঠামোর সাথে সামঞ্জস্য করতে পারেন।


4
ক্লাসে বা একা একা পদ্ধতি beginএবং endপদ্ধতিগুলি। এটি কিছুটা আলাদা আইএমও।
ইমেসেক্স

4
তাই কি? আবার আপনার কোডের নির্দিষ্ট নির্মাণের উপর নির্ভর করে একটি খাঁটি ভাষা নির্মাণ করতে পারেন। এছাড়া নতুন শব্দ প্রবর্তনের দ্বারা সম্পন্ন য়েত, উদাহরণস্বরূপ,iterable class MyClass { };
ভূত

তবে আপনি পদ্ধতিগুলি যেখানেই চান সেখানে রাখতে পারেন, প্রয়োগ করুন তবে আপনি চান .. কিছুটা মিল আছে, আমি সম্মত! এই প্রশ্নটি initializer_listযদিও
এমিসেক্স

4

এটি প্রকৃতপক্ষে নতুন কিছু নয় এবং কতজন চিহ্নিত করেছেন, এই অনুশীলনটি সি ++ এ ছিল এবং সেখানে আছে, বলুন, সি # তে।

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

সুতরাং, এটা আসলে ভালো কিছু আছে: core::initializer_list, core::size_t, core::begin(),core::end() এবং তাই। এটি কেবলমাত্র একটি দুর্ভাগ্যজনক কাকতালীয় বিষয় যা stdনেমস্পেসের অভ্যন্তরে কিছু মূল ভাষার গঠন রয়েছে।


2

এটি কেবল স্ট্যান্ডার্ড লাইব্রেরিতে পুরোপুরি কাজ করতে পারে না। স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্তির অর্থ এই নয় যে সংকলকটি চতুর কৌশল খেলতে পারে না।

যদিও এটি সব ক্ষেত্রে সক্ষম না হতে পারে, এটি খুব ভালভাবে বলতে পারে: এই প্রকারটি সুপরিচিত, বা একটি সাধারণ প্রকার, উপেক্ষা করতে দেয় initializer_listএবং আরম্ভ করা মানটি কী হওয়া উচিত তার একটি মেমরি চিত্র দেয়।

অন্য কথায় int i {5};সমতূল্য হতে পারে int i(5);বা int i=5;বা এমনকি intwrapper iw {5};কোথায় intwrapperএকটি তুচ্ছ কন্সট্রাকটর একটি গ্রহণ সঙ্গে একটি int- এ ওভার বর্গ মোড়কের একটি সহজinitializer_list


আমাদের কি সংকলকগুলির প্রকৃতপক্ষে "চৌকস কৌশল" খেলে পুনরায় প্রজননযোগ্য উদাহরণ রয়েছে? কিন্ডা যদি ই-ইফ-এর অধীনে যুক্তি দেখায় তবে আমি দৃstan়তা দেখতে চাই।
আন্ডারস্কোর_

সংকলকগুলি অনুকূলকরণের ধারণাটি হল যে সংকলক কোডটি কোনও সমতুল্য কোডে রূপান্তর করতে পারে। সি ++ বিশেষত "ফ্রি" বিমূর্ততাগুলির জন্য অপ্টিমাইজেশানের উপর নির্ভর করে। স্ট্যান্ডার্ড লাইব্রেরি থেকে কোড প্রতিস্থাপনের ধারণাটি সাধারণ ( জিসিসি বিল্টিন তালিকা gcc.gnu.org/onlinesocs/gcc/Other-Builtins.html দেখুন )।
পল ডি ভ্রিজ

আসলে, আপনার ধারণা যে int i {5}কোনও জড়িত std::initializer_listintকোনও কনস্ট্রাক্টর নিচ্ছে না std::initializer_list, সুতরাং এটি 5নির্মাণের জন্য সরাসরি ব্যবহৃত হয়। সুতরাং মূল উদাহরণটি অপ্রাসঙ্গিক; করার কোনও অপ্টিমাইজেশন নেই। এর বাইরে, যেহেতু std::initializer_listসংকলকটি একটি 'কাল্পনিক' অ্যারে তৈরি এবং প্রক্সিং জড়িত, আমি অনুমান করি এটি অপ্টিমাইজেশনের পক্ষে হতে পারে তবে এটি সংকলকটির 'ম্যাজিক' অংশ, তাই সাধারণভাবে অপটিমাইজার সুন্দরটির সাথে চতুর কিছু করতে পারে কিনা তা থেকে পৃথক 2 টি পুনরুক্তি বিশিষ্ট নিস্তেজ অবজেক্ট যা ফলাফল দেয়
আন্ডারস্কোর_ড

1

এটি মূল ভাষার অংশ নয় কারণ এটি পুরোপুরি লাইব্রেরিতে প্রয়োগ করা যেতে পারে, কেবল লাইন operator newএবং operator delete। সংকলকগুলি এটি তৈরিতে আরও জটিল করার ক্ষেত্রে কী সুবিধা হবে?

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