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

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

Barbara Streisand
Lepaskan: 2024-11-02 06:53:02
asal
948 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan