Rumah >pembangunan bahagian belakang >C++ >Mengapakah rentetan literal memanggil `bool` lebihan dan bukannya `std::string` lebihan dalam C ?

Mengapakah rentetan literal memanggil `bool` lebihan dan bukannya `std::string` lebihan dalam C ?

Patricia Arquette
Patricia Arquetteasal
2024-11-04 10:12:01861semak imbas

Why does a string literal call a `bool` overload instead of a `std::string` overload in C  ?

String Literals dan Bool Overload Resolution dalam C

Dalam C , kaedah terlebih beban membolehkan anda mentakrifkan berbilang kaedah dengan nama yang sama tetapi parameter berbeza jenis. Walau bagaimanapun, mencari beban yang tepat untuk dilaksanakan mungkin kelihatan tidak dijangka pada masa-masa tertentu. Mari kita terokai sebab rentetan literal sepadan dengan lebihan bool dan bukannya lebihan std::string dalam kes tertentu.

Pertimbangkan kod 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;
    }
};

Output::Print("Hello World");</code>

Apabila kita memanggil Output::Cetak dengan "Hello World", kami mungkin menjangkakan ia akan mencetak rentetan literal. Walau bagaimanapun, yang mengejutkan, ia mencetak Benar. Ini berlaku kerana penukaran tersirat yang berlaku di bawah hud.

Dalam C , literal rentetan seperti "Hello World" mempunyai jenis "tatasusunan 12 aksara const." Ia boleh ditukar secara tersirat kepada "penunjuk kepada const char," yang seterusnya boleh ditukar secara tersirat kepada bool. Urutan penukaran standard ini diutamakan berbanding jujukan penukaran yang ditentukan pengguna yang akan menukar rentetan literal kepada std::string.

Mengikut standard C (13.3.3.2/2), jujukan penukaran standard diberikan lebih tinggi keutamaan daripada jujukan penukaran yang ditentukan pengguna semasa resolusi beban lampau. Memandangkan penukaran daripada literal rentetan kepada bool ialah penukaran standard, ia diutamakan berbanding penukaran std::string dan lebihan Print(bool) dipilih.

Untuk memastikan lebihan std::string adalah dipanggil, secara eksplisit memberikan nilai std::string:

<code class="cpp">Output::Print(std::string("Hello World"));</code>

Memahami penukaran tersirat dan peraturan penyelesaian beban lampau ini adalah penting dalam C untuk mengelakkan kekeliruan dan memastikan lebihan beban yang dimaksudkan dilaksanakan.

Atas ialah kandungan terperinci Mengapakah rentetan literal memanggil `bool` lebihan dan bukannya `std::string` lebihan dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn