২০১ belt সালের আলোকিত যুগে, আমাদের বেল্টের অধীনে দুটি নতুন মানদণ্ডের সাথে এই প্রশ্নটি জিজ্ঞাসা করা হয়েছিল এবং ঠিক কোণার চারপাশে একটি নতুন প্রশ্ন রয়েছে, জেনে রাখা গুরুত্বপূর্ণ বিষয়টি হ'ল সি ++ 17 স্ট্যান্ডার্ডকে সমর্থনকারী সংকলকরা আপনার কোডটি যেমনটি ঠিক তেমন সংকলন করবে ।
C ++ 17 এ শ্রেণি টেম্পলেটগুলির জন্য টেম্পলেট-যুক্তি ছাড়
এখানে (স্বীকৃত উত্তরের ওলঝাস ঝুমাব্যাকের সম্পাদনার সৌজন্যে) স্ট্যান্ডার্ডে প্রাসঙ্গিক পরিবর্তনগুলি বিশদযুক্ত কাগজটি।
অন্যান্য উত্তর থেকে উদ্বেগের সমাধান
বর্তমান শীর্ষ রেট উত্তর
এই উত্তরটি নির্দেশ করে যে "অনুলিপি নির্মাণকারী এবং operator=
" সঠিক টেম্পলেট বিশেষণাদি জানত না।
এটি আজেবাজে কথা, কারণ মানক অনুলিপি-নির্মাতা এবং operator=
কেবল একটি পরিচিত টেম্পলেট ধরণের জন্য বিদ্যমান :
template <typename T>
class MyClass {
MyClass(const MyClass&) =default;
... etc...
};
// usage example modified from the answer
MyClass m(string("blah blah blah"));
MyClass *pm; // WHAT IS THIS?
*pm = m;
এখানে, আমি মন্তব্য উল্লেখ করেছি, এমন হয় কোন কারণ জন্য MyClass *pm
সহ বা অনুমান নতুন ফর্ম ছাড়া একটি আইনি ঘোষণা করা: MyClass
একটি টাইপ নয় (এটি একটি টেমপ্লেট), তাই এটি অর্থে দেখা যায় না একটি পয়েন্টার ডিক্লেয়ার করার মত প্রকার MyClass
। উদাহরণটি ঠিক করার একটি সম্ভাব্য উপায় এখানে:
MyClass m(string("blah blah blah"));
decltype(m) *pm; // uses type inference!
*pm = m;
এখানে, pm
হয় ইতিমধ্যে সঠিক ধরনের, এবং তাই অনুমান তুচ্ছ হয়। তদুপরি, অনুলিপি করে অনুলিপিটি মিশ্রিত করা অসম্ভবভাবে অনুলিপি করে যখন কপি-নির্মাণকারীকে কল করে:
MyClass m(string("blah blah blah"));
auto pm = &(MyClass(m));
এখানে, pm
একটি অনুলিপি পয়েন্টার হবে m
। এখানে, MyClass
থেকে কপি-নির্মাণ করা হচ্ছে m
-যেটা ধরনের হয় MyClass<string>
(এবং না অবাস্তব ধরনের MyClass
)। সুতরাং, যেখানে এ pm
'র টাইপ অনুমিত হয়, হয় জানাতে চাই যে, এর টেমপ্লেট-টাইপ যথেষ্ট তথ্য m
, সেইজন্য এবং এর টেমপ্লেট-টাইপ pm
হয় string
।
তদতিরিক্ত, নিম্নলিখিতগুলি সর্বদা একটি সংকলন ত্রুটি উত্থাপন করবে :
MyClass s(string("blah blah blah"));
MyClass i(3);
i = s;
এটি কারণ অনুলিপি নির্মাণকারীর ঘোষণাগুলি তাত্পর্যপূর্ণ নয় :
MyClass(const MyClass&);
এখানে, অনুলিপি-নির্মাণকারী যুক্তির টেম্পলেট-টাইপ সামগ্রিকভাবে শ্রেণীর টেম্পলেট-টাইপের সাথে মেলে ; অর্থাত, যখন MyClass<string>
instantiated হয়, MyClass<string>::MyClass(const MyClass<string>&);
এটা দিয়ে instantiated করা হয়, এবং যখন MyClass<int>
instantiated হয়, MyClass<int>::MyClass(const MyClass<int>&);
instantiated করা হয়। যতক্ষণ না এটি স্পষ্টভাবে নির্দিষ্ট না করা হয় বা একটি তদন্তকারী নির্মাণকারীর ঘোষণা না দেওয়া হয় MyClass<int>::MyClass(const MyClass<string>&);
, সংকলকটির তাত্ক্ষণিক কারণ হওয়ার কোনও কারণ নেই , যা স্পষ্টতই অনুপযুক্ত।
ক্যাটালিন পিটিয়সের উত্তর ș
পিতি কেটে নেওয়ার উদাহরণ দেয় Variable<int>
এবং Variable<double>
বলে:
দুটি ভিন্ন ধরণের (ভেরিয়েবল এবং ভেরিয়েবল) কোডে আমার একই ধরণের নাম (ভেরিয়েবল) রয়েছে। আমার বিষয়ভিত্তিক দৃষ্টিকোণ থেকে, এটি কোডের পঠনযোগ্যতাকে অনেক বেশি প্রভাবিত করে।
আগের উদাহরণে উল্লিখিত Variable
নিজেই না একটি টাইপ নাম, যদিও নতুন বৈশিষ্ট্য তোলে এক চিহ্নগুলি সিন্টেক্সের মত চেহারা।
পিতি তারপরে জিজ্ঞাসা করে যে কোনও কনস্ট্রাক্টর না দেওয়া হয়েছে যা উপযুক্ত অনুমানের অনুমতি দেয়। উত্তরটি হ'ল কোনও অনুমানের অনুমতি নেই, কারণ কনস্ট্রাক্টর কল দ্বারা অনুমানটি ট্রিগার করা হয়েছে । কনস্ট্রাক্টর-কল ছাড়া কোনও অনুকরণ নেই ।
এটি foo
এখানে কোন সংস্করণটি বাদ দেওয়া হবে তা জিজ্ঞাসার অনুরূপ :
template <typename T> foo();
foo();
উত্তরটি হ'ল এই কোডটি অবৈধ, কারণটির কারণেই।
এমসাল্টারের উত্তর
এটি, যতদূর আমি বলতে পারি, প্রস্তাবিত বৈশিষ্ট্যটি সম্পর্কে বৈধ উদ্বেগ প্রকাশের একমাত্র উত্তর।
উদাহরণটি হ'ল:
Variable var(num); // If equivalent to Variable<int> var(num),
Variable var2(var); // Variable<int> or Variable<Variable<int>> ?
মূল প্রশ্নটি হ'ল সংকলকটি কি এখানে টাইপ-ইনফেরার্ড কন্সট্রাক্টর বা কপি কনস্ট্রাক্টর নির্বাচন করে?
কোডটি চেষ্টা করে দেখতে পেলাম আমরা অনুলিপি নির্মাণকারী নির্বাচিত হয়েছি। উদাহরণটি প্রসারিত করতে :
Variable var(num); // infering ctor
Variable var2(var); // copy ctor
Variable var3(move(var)); // move ctor
// Variable var4(Variable(num)); // compiler error
প্রস্তাব এবং আদর্শের নতুন সংস্করণটি কীভাবে এটি নির্দিষ্ট করে আমি নিশ্চিত নই; এটি "ছাড়ের গাইড" দ্বারা নির্ধারিত বলে মনে হয় যা স্ট্যান্ডার্ডিজের একটি নতুন বিট যা আমি এখনও বুঝতে পারি না।
var4
ছাড়ও কেন অবৈধ তা আমিও নিশ্চিত নই ; জি ++ থেকে সংকলক ত্রুটিটি ইঙ্গিত করে যে বিবৃতিটি একটি কার্য ঘোষণার হিসাবে পার্স করা হচ্ছে।