Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `Output::Print(\"Hello World\")` mencetak \"True\" dan bukannya \"Hello World\"?

Mengapakah `Output::Print(\"Hello World\")` mencetak \"True\" dan bukannya \"Hello World\"?

Barbara Streisand
Barbara Streisandasal
2024-11-02 06:53:02800semak imbas

Why does `Output::Print(

String Literal Overload Conflict: Bool vs. std::string

Dalam C , kaedah kelas boleh terlebih muatan untuk menerima jenis parameter yang berbeza Walau bagaimanapun, kadangkala rentetan literal mungkin secara tidak dijangka memadankan lebihan jenis boolean dan bukannya lebihan std::string yang dijangkakan.

Perihalan masalah:

Andaikan kita mempunyai kelas Output yang ditakrifkan seperti 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 Output::Print("Hello World "), hasil output ialah "Benar" dan bukannya "Hello World" yang dijangkakan.

Analisis masalah:

Walaupun kami mentakrifkan std::string overload, "Hello World" sebenarnya ialah pemalar tatasusunan aksara yang boleh ditukar secara tersirat kepada bool. Pengkompil lebih suka penukaran standard ini berbanding pembina penukaran std::string yang ditentukan pengguna.

Menurut standard C (§13.3.3.2/2), pesanan penukaran standard mengatasi pesanan penukaran yang ditentukan pengguna. Oleh itu, pengkompil memilih bool overload kerana ia mempunyai tertib penukaran yang lebih baik.

Penyelesaian:

Untuk memanggil secara eksplisit std::string overload, kita perlu secara eksplisit menghantar "Hello World" sebagai std::string:

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

Atas ialah kandungan terperinci Mengapakah `Output::Print(\"Hello World\")` mencetak \"True\" dan bukannya \"Hello World\"?. 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