Rumah > pembangunan bahagian belakang > C++ > Parse Paling Menjengkelkan: Pemasa() - Panggilan Objek atau Fungsi?

Parse Paling Menjengkelkan: Pemasa() - Panggilan Objek atau Fungsi?

Patricia Arquette
Lepaskan: 2024-10-31 18:09:01
asal
358 orang telah melayarinya

The Most Vexing Parse: Timer() - Object or Function Call?

Penghuraian Paling Menjengkelkan: Membongkar Kekaburan dalam C 11

Kekaburan "penghuraian paling menjengkelkan" dalam C 11 muncul dengan sendirinya apabila menggunakan pemula seragam, seperti yang dibuktikan dalam coretan kod berikut:

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

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

int main()
{
    auto dv = Timer(); // Ambiguity: Object or function call?
    int time_keeper(Timer()); // Ambiguity: Pointer or call?
    return 0;
}</code>
Salin selepas log masuk

Memahami Ungkapan Pertama (auto dv = Timer())

Dalam ungkapan pertama, kata kunci auto membayangkan bahawa jenis dv disimpulkan daripada pemula di sebelah kanan tanda sama (=). Pemula ialah panggilan kepada pembina Pemasa tanpa hujah, yang mengembalikan objek Pemasa. Oleh itu, dv ialah objek jenis Pemasa.

Memahami Ungkapan Kedua (int time_keeper(Timer()))

Dalam ungkapan kedua, kesamaran timbul kerana pengkompil tidak boleh menentukan sama ada Pemasa() ialah panggilan fungsi atau objek jenis Pemasa yang diluluskan melalui rujukan.

  • Jika Pemasa() ialah panggilan fungsi, maka int time_keeper(Pemasa()) mengisytiharkan fungsi dipanggil time_keeper yang mengambil objek Pemasa sebagai input dan mengembalikan int.
  • Jika Pemasa() ialah objek jenis Pemasa, maka int time_keeper(Pemasa()) mengisytiharkan fungsi dipanggil time_keeper yang mengambil penunjuk ke objek Pemasa sebagai input dan mengembalikan int.

Walau bagaimanapun, kerana fungsi mereput kepada penunjuk apabila dihantar sebagai hujah, jenis penjaga_masa yang sebenar ialah int(Pemasa(*)()), yang menyelesaikan masalah kekaburan yang memihak kepada tafsiran penunjuk kepada fungsi.

Atas ialah kandungan terperinci Parse Paling Menjengkelkan: Pemasa() - Panggilan Objek atau Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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