Rumah >pembangunan bahagian belakang >C++ >Mengapakah `func(\'one\')` menyebabkan ralat dalam penukaran tersirat C?
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!