Apakah membuat konstruktor yang memiliki banyak argumen explicit
memiliki efek (berguna)?
Contoh:
class A {
public:
explicit A( int b, int c ); // does explicit have any (useful) effect?
};
c++
explicit-constructor
Peter G.
sumber
sumber
explicit
. Saya pribadi tidak akan repot-repot membuat konstruktor multi-argumenexplicit
.Anda akan menemukannya untuk inisialisasi brace (misalnya dalam array)
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; }
sumber
Jawaban luar biasa dari @StoryTeller dan @Sneftel adalah alasan utamanya. Namun, IMHO, ini masuk akal (setidaknya saya melakukannya), sebagai bagian dari pembuktian masa depan perubahan kode. Pertimbangkan contoh Anda:
class A { public: explicit A( int b, int c ); };
Kode ini tidak mendapatkan keuntungan secara langsung
explicit
.Beberapa waktu kemudian, Anda memutuskan untuk menambahkan nilai default
c
, sehingga menjadi seperti ini:class A { public: A( int b, int c=0 ); };
Saat melakukan ini, Anda memusatkan perhatian pada
c
parameter - dalam retrospeksi, itu harus memiliki nilai default. Anda tidak perlu fokus pada apakahA
itu sendiri harus dibangun secara implisit. Sayangnya, perubahan ini membuatexplicit
relevan kembali.Jadi, untuk menyampaikan bahwa seorang ctor
explicit
, mungkin ada gunanya melakukannya saat pertama kali menulis metode.sumber
explicit
yang sudah ada di sana selamanya, dan dukungan teknis akan dibanjiri dengan panggilan tentang perubahan itu dan menghabiskan berjam - jam menjelaskan bahwaexplicit
itu hanya kebisingan, dan menghapusnya tidak berbahaya. Secara pribadi, saya tidak pandai memprediksi masa depan; cukup sulit untuk memutuskan seperti apa tampilan antarmuka sekarang .Inilah lima sen saya untuk diskusi ini:
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; }
Seperti yang dapat Anda lihat dengan mudah,
explicit
mencegah dari menggunakan daftar penginisialisasi bersama denganbar
fungsi bacause konstruktorstruct Bar
dideklarasikan sebagaiexplicit
.sumber