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

Patricia Arquette
Lepaskan: 2024-11-01 01:14:28
asal
538 orang telah melayarinya

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

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

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!