Rumah >pembangunan bahagian belakang >C++ >Mengapa C Membenarkan Hanya Satu Penukaran Ditakrifkan Pengguna Semasa Penukaran Jenis Tersirat?

Mengapa C Membenarkan Hanya Satu Penukaran Ditakrifkan Pengguna Semasa Penukaran Jenis Tersirat?

Patricia Arquette
Patricia Arquetteasal
2024-11-01 01:14:28616semak imbas

Why Does C   Allow Only One User-Defined Conversion During Implicit Type Conversions?

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!

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