Penukaran Tersirat C: Memahami Peraturan Penukaran Ditakrifkan Pengguna
Berdasarkan maklum balas terkini tentang respons sebelumnya, adalah penting untuk menjelaskan pemahaman penukaran tersirat dalam C .
Pertimbangkan coretan kod berikut:
<code class="c++">#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>
Panggilan fungsi pertama mengakibatkan ralat kerana tiada penukaran langsung daripada aksara const* kepada A. Walaupun terdapat penukaran daripada rentetan kepada A, penggunaan ini memerlukan berbilang penukaran, yang tidak dibenarkan.
Piawaian C (SC22-N-4411.pdf) menyediakan jawapan dalam bahagian 12.3.4 bertajuk 'Penukaran':
"4 At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value."
Ini bermakna hanya satu penukaran tersirat yang ditentukan pengguna (sama ada pembina atau fungsi penukaran) boleh digunakan pada satu nilai semasa penukaran atau permulaan jenis tersirat.
Dalam kod yang diberikan, panggilan fungsi pertama, func("one"), cuba menggunakan penukaran tersirat daripada const char* "one" kepada A, tetapi ia gagal kerana ini memerlukan dua penukaran (satu daripada const char * ke std::string, dan satu lagi dari std::string ke A). Dua lagi panggilan fungsi adalah sah kerana ia melibatkan hanya satu penukaran tersirat setiap satu.
Atas ialah kandungan terperinci Mengapa C Membenarkan Hanya Satu Penukaran Ditakrifkan Pengguna Semasa Penukaran Jenis Tersirat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!