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

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

Patricia Arquette
Patricia Arquetteasal
2024-10-31 18:09:01201semak imbas

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>

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:
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