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
Lepaskan: 2024-11-01 05:36:02
asal
526 orang telah melayarinya

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

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

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 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