Rumah >pembangunan bahagian belakang >C++ >Mengapakah `func(\'one\')` menyebabkan ralat dalam penukaran tersirat C?

Mengapakah `func(\'one\')` menyebabkan ralat dalam penukaran tersirat C?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-01 05:36:02444semak imbas

Why does `func(

Penukaran Tersirat C

Dalam konteks C , konsep penukaran tersirat telah menjadi subjek perbincangan. Jawapan terbaru tentang "Apakah pelakon berguna lain yang boleh digunakan dalam C ?" menimbulkan persoalan tentang pemahaman yang betul tentang penukaran dalam C .

Pertimbangkan coretan kod berikut:

<code class="cpp">#include <string>

struct A {
    A(const std::string &s) {}
};

void func(const A &a) {
}

int main() {
    func("one");                  // error
    func(A("two"));           // ok
    func(std::string("three"));   // ok
}</code>

Dalam coretan ini, panggilan fungsi pertama, func("one"), menghasilkan satu kesilapan. Ini kerana tiada penukaran langsung daripada const char * kepada A. Walaupun terdapat penukaran daripada rentetan kepada A, penggunaannya akan melibatkan berbilang penukaran tersirat, yang tidak dibenarkan mengikut piawaian C.

Piawaian C (SC22-N-4411.pdf) dalam bahagian 12.3.4 "Penukaran" menyatakan:

4 At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value.

Ini bermakna hanya satu penukaran takrif pengguna tersirat boleh digunakan semasa melakukan penukaran . Dalam panggilan fungsi pertama, kedua-dua penukaran daripada const char * kepada rentetan dan penukaran daripada rentetan kepada A ialah penukaran yang ditentukan pengguna. Memandangkan lebih daripada satu penukaran diperlukan, pengkompil menimbulkan ralat.

Atas ialah kandungan terperinci Mengapakah `func(\'one\')` menyebabkan ralat dalam penukaran tersirat 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