Apakah Penghuraian Paling Menjengkelkan dan Mengapa Ia Berlaku dalam C 11?

Barbara Streisand
Lepaskan: 2024-11-01 10:55:30
asal
773 orang telah melayarinya

What's the Most Vexing Parse and Why Does It Happen in C  11?

Memahami Pemula Seragam dan Penghuraian Paling Menjengkelkan

Dalam C 11, pemula seragam menyediakan sintaks ringkas untuk memulakan objek dan struktur data. Walau bagaimanapun, penggunaannya boleh membawa kepada potensi kekaburan, yang dikenali sebagai "penghuraian paling menjengkelkan."

Paling Menjengkelkan

Pertimbangkan coretan kod berikut:

<code class="cpp">#include<iostream>

class Timer
{
public:
    Timer() {}
};

int main() 
{
    auto dv = Timer(); // What is Timer() ? And what type is dv?
    int time_keeper(Timer()); // This is a function right? And why isn't the argument " Timer (*) ()"?
    return 0;
}</code>
Salin selepas log masuk

Analisis:

dv = Pemasa();

  • Pemasa() boleh ditafsirkan sebagai sama ada fungsi panggilan atau pembinaan objek.
  • Oleh kerana auto digunakan untuk mengisytiharkan dv, jenisnya disimpulkan daripada ungkapan di sebelah kanan.
  • Jika Pemasa() ditafsirkan sebagai panggilan fungsi , dv akan menjadi int kerana Timer() bukan fungsi yang mengembalikan objek.
  • Walau bagaimanapun, jika Timer() ditafsirkan sebagai pembinaan objek, dv akan menjadi objek Pemasa.

int time_keeper(Timer());

  • Timer() ditafsirkan sebagai mencipta objek Pemasa sementara.
  • Argumen penjaga masa ialah penunjuk kepada fungsi yang mengembalikan Pemasa dan tidak mengambil hujah.
  • Fungsi secara tersirat ditukar kepada penunjuk apabila diluluskan sebagai hujah.
  • Oleh itu, jenis penjaga_masa ialah int(Pemasa (*)()).

Kesimpulan:

Dalam senario "paling menjengkelkan", pengkompil cuba membuat kesimpulan jenis dan tafsiran sesuatu ungkapan berdasarkan konteks dan peraturan. Dengan memahami cara peraturan ini digunakan, pengaturcara boleh mengelakkan kekaburan dan menulis kod dengan niat yang jelas.

Atas ialah kandungan terperinci Apakah Penghuraian Paling Menjengkelkan dan Mengapa Ia Berlaku dalam C 11?. 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!