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
295 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!

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