Rumah >pembangunan bahagian belakang >C++ >Mengapakah rentetan literal mencetuskan lebihan `bool` dalam lebihan fungsi?

Mengapakah rentetan literal mencetuskan lebihan `bool` dalam lebihan fungsi?

Patricia Arquette
Patricia Arquetteasal
2024-11-02 13:47:30374semak imbas

Why does a string  literal trigger the `bool` overload in function overloading?

String Literal Ambiguity in Function Overloading with bool

Apabila mentakrifkan kaedah terlebih beban yang menerima kedua-dua bool dan std::string hujah, pembangun mungkin menghadapi tingkah laku yang tidak dijangka apabila menyediakan literal rentetan. Daripada menggunakan std::string overload, bool overload diutamakan.

Untuk memahami tingkah laku ini, pertimbangkan situasi 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>

Walaupun menyediakan rentetan literal, Print( ) kaedah dengan lebihan bool digunakan. Ini kerana literal rentetan dalam C boleh ditukar secara tersirat kepada nilai bool. Khususnya, "Hello World" ialah tatasusunan const char* yang boleh ditafsirkan sebagai penunjuk kepada const char, yang seterusnya boleh ditukar secara tersirat kepada bool. Penukaran ini dianggap sebagai jujukan penukaran standard.

C mengutamakan jujukan penukaran standard berbanding penukaran yang ditentukan pengguna (cth., penukaran daripada std::string ke bool). Menurut piawaian C (§13.3.3.2/2), jujukan penukaran standard sentiasa dianggap sebagai jujukan penukaran yang lebih baik.

Tingkah laku ini boleh diubah dengan secara eksplisit menyediakan argumen std::string kepada Print( ) kaedah:

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

Atas ialah kandungan terperinci Mengapakah rentetan literal mencetuskan lebihan `bool` dalam lebihan fungsi?. 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