একাধিক যুক্তিযুক্ত কনস্ট্রাক্টর তৈরি করার কি explicit
কোনও (কার্যকর) প্রভাব আছে?
উদাহরণ:
class A {
public:
explicit A( int b, int c ); // does explicit have any (useful) effect?
};
উত্তর:
সি ++ 11 অবধি, হ্যাঁ, explicit
মাল্টি-আরগ নির্মাণকারীকে ব্যবহার করার কোনও কারণ নেই ।
এটি সি ++ 11-এ পরিবর্তিত হয় কারণ ইনিশিয়ালাইজার তালিকার কারণে। প্রাথমিকভাবে, কপিরাইট-ইনিশিয়ালাইজেশন (তবে সরাসরি সূচনা নয়) প্রাথমিক স্তরের তালিকার সাথে কনস্ট্রাক্টরকে চিহ্নিত না করা দরকার explicit
।
উদাহরণ:
struct Foo { Foo(int, int); };
struct Bar { explicit Bar(int, int); };
Foo f1(1, 1); // ok
Foo f2 {1, 1}; // ok
Foo f3 = {1, 1}; // ok
Bar b1(1, 1); // ok
Bar b2 {1, 1}; // ok
Bar b3 = {1, 1}; // NOT OKAY
explicit
। আমি ব্যক্তিগতভাবে মাল্টি-আরগ কনস্ট্রাক্টর তৈরির বিষয়ে বিরক্ত করব না explicit
।
আপনি এটি বন্ধনী আরম্ভের জন্য হোঁচট খাবেন (উদাহরণস্বরূপ অ্যারেতে)
struct A {
explicit A( int b, int c ) {}
};
struct B {
B( int b, int c ) {}
};
int main() {
B b[] = {{1,2}, {3,5}}; // OK
A a1[] = {A{1,2}, A{3,4}}; // OK
A a2[] = {{1,2}, {3,4}}; // Error
return 0;
}
@ স্টেরিটেলার এবং @ স্নেফটেলের চমৎকার উত্তরগুলি মূল কারণ। যাইহোক, আইএমএইচও, এটি ভবিষ্যতে প্রুফিংয়ের অংশ হিসাবে পরে কোডটিতে পরিবর্তিত হয়, এর অর্থ (কমপক্ষে আমি এটি করি) makes আপনার উদাহরণ বিবেচনা করুন:
class A {
public:
explicit A( int b, int c );
};
এই কোড থেকে সরাসরি উপকার হয় না explicit
।
কিছু সময় পরে, আপনি এর জন্য একটি ডিফল্ট মান যুক্ত করার সিদ্ধান্ত নিয়েছেন c
, তাই এটি এটি হয়ে যায়:
class A {
public:
A( int b, int c=0 );
};
এটি করার সময়, আপনি c
প্যারামিটারটির দিকে মনোযোগ দিচ্ছেন - পূর্ববর্তী ক্ষেত্রে, এটির একটি ডিফল্ট মান হওয়া উচিত। আপনি A
নিজেরাই নিখুঁতভাবে নির্মিত উচিত কিনা তা নিয়ে অবিচ্ছিন্নভাবে আলোচনা করছেন না । দুর্ভাগ্যক্রমে, এই পরিবর্তনটি explicit
আবার প্রাসঙ্গিক করে তোলে ।
সুতরাং, কোনও সিটিরটি বোঝাতে explicit
যাতে প্রথমে পদ্ধতিটি লেখার সময় এটি প্রদান করতে পারে।
explicit
যে চিরকাল হয়েছে, এবং কারিগরি সহায়তা যে পরিবর্তন সম্পর্কে কলের মাধ্যমে প্লাবিত করা হবে এবং ব্যয় ঘণ্টা ব্যাখ্যা করলেন যে explicit
শুধু গোলমাল ছিল, এবং এটি নিরীহ হয় সরানোর যে। ব্যক্তিগতভাবে, আমি ভবিষ্যতের ভবিষ্যদ্বাণী করতে খুব একটা ভাল না; এটি হার্ড যথেষ্ট সিদ্ধান্ত কি একটি ইন্টারফেস মত হওয়া উচিত এর এখন ।
এই আলোচনার জন্য আমার পাঁচটি সেন্ট এখানে:
struct Foo {
Foo(int, double) {}
};
struct Bar {
explicit Bar(int, double) {}
};
void foo(const Foo&) {}
void bar(const Bar&) {}
int main(int argc, char * argv[]) {
foo({ 42, 42.42 }); // valid
bar({ 42, 42.42 }); // invalid
return 0;
}
আপনি সহজেই দেখতে পাচ্ছেন, ফাংশন ব্যাকস এর explicit
পাশাপাশি bar
আর্টিকালাইজার তালিকাটি ব্যবহার করতে বাধা দেয় কারণ নির্মাতা struct Bar
হিসাবে ঘোষণা করা হয় explicit
।