String Literal Matching Boolean Overload Daripada std::string
Pertimbangkan kod C berikut:
<code class="cpp">class Output { public: static void Print(bool value) { std::cout << (value ? "True" : "False"); } static void Print(std::string value) { std::cout << value; } };</code>
Apabila memanggil kaedah seperti berikut:
<code class="cpp">Output::Print("Hello World");</code>
Anda mungkin terkejut melihat output:
True
Mengapa kelebihan boolean kaedah Cetak dipanggil dan bukannya std: :String overload?
Memahami Mekanisme Penukaran
Rentetan literal dalam C , seperti "Hello World", disimpan sebagai tatasusunan aksara const. Walau bagaimanapun, ia boleh ditukar secara tersirat kepada penunjuk kepada aksara const, yang kemudiannya boleh ditukar kepada bool.
Dalam kod yang disediakan, pengkompil memilih jujukan penukaran standard daripada "Hello World" untuk bool berbanding pengguna- turutan penukaran yang ditentukan daripada "Hello World" kepada std::string. Keutamaan ini adalah berdasarkan standard C, yang menyatakan bahawa jujukan penukaran standard diutamakan berbanding jujukan penukaran yang ditentukan pengguna.
Menyelesaikan Isu
Untuk memastikan bahawa std :: string overload dipanggil, secara eksplisit lulus argumen std::string:
<code class="cpp">Output::Print(std::string("Hello World"));</code>
Dengan berbuat demikian, anda memaksa pengkompil untuk menggunakan std::string overload, yang akan mengeluarkan "Hello World" dengan betul .
Atas ialah kandungan terperinci Mengapa Kod C Saya Mencetak \'True\' Daripada \'Hello World\'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!