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

sumber:php.cn
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