এই কোডটি বিবেচনা করুন:
#include <vector>
#include <iostream>
enum class A
{
X, Y
};
struct Test
{
Test(const std::vector<double>&, const std::vector<int>& = {}, A = A::X)
{ std::cout << "vector overload" << std::endl; }
Test(const std::vector<double>&, int, A = A::X)
{ std::cout << "int overload" << std::endl; }
};
int main()
{
std::vector<double> v;
Test t1(v);
Test t2(v, {}, A::X);
}
এই মুদ্রণ:
vector overload
int overload
অস্পষ্ট ওভারলোড রেজোলিউশনের কারণে কেন এটি সংকলন ত্রুটি তৈরি করে না? যদি দ্বিতীয় কনস্ট্রাক্টর সরানো হয় তবে আমরা vector overload
দু'বার পাই । কীভাবে / কোন মেট্রিকের তুলনায় int
দ্ব্যর্থহীনভাবে আরও ভাল ম্যাচ হয় ?{}
std::vector<int>
কনস্ট্রাক্টর স্বাক্ষরটি অবশ্যই আরও ছাঁটাই করা যেতে পারে, তবে আমি কেবল কোডের একটি সমতুল অংশ দ্বারা চালিত হয়েছি এবং নিশ্চিত করতে চাই যে এই প্রশ্নের জন্য গুরুত্বপূর্ণ কোনও কিছুই হারিয়েছে না।
{}
নির্দিষ্ট কিছু ক্ষেত্রে কার্যকরভাবে কার্যকর করে তবে এটি সাধারণত সঠিক হয় না (শুরুতে, std::vector<int> x = {};
কাজ করে, std::vector <int> x = 0;
না করে)। এটি " {}
শূন্যকে নির্ধারণ করে " এর মতো সহজ নয় ।
struct A { int x = 5; }; A a = {};
কোনও অর্থে শূন্য বরাদ্দ করে না, এটি একটি A
দিয়ে তৈরি করে a.x = 5
। এটি এর বিপরীত A a = { 0 };
, যা a.x
0 থেকে আরম্ভ করে The শূন্যটি অন্তর্নিহিত নয় {}
, প্রতিটি প্রকারটি কীভাবে ডিফল্ট-নির্মিত বা মান-প্রাথমিককরণ হয় তা সহজাত । দেখুন এখানে , এখানে এবং এখানে ।
{}
ব্লক হিসাবে সুস্পষ্টভাবে স্মরণ করি , 0 কে ভেরিয়েবলগুলিকে বরাদ্দ করি - উদাহরণস্বরূপ: কনট চর x = {}; 0 (নাল চর) এ সেট করা হয়, আন্ত ইত্যাদি ইত্যাদির জন্য একই