Saya pasti melewatkan sesuatu, tapi saya tidak mengerti mengapa ini mengkompilasi (dengan g ++ & clang ++):
struct A
{
};
struct B
{
};
int main()
{
A a(B);
}
Pertama-tama, B
adalah tipe ... bukan nilai. Bagaimana saya menafsirkan kode ini?
c++
syntax
declaration
most-vexing-parse
Picaud Vincent
sumber
sumber
A a(B());
yang bisa menjadi definisi variabel atau deklarasi fungsi.struct A{}; int main() { A(foo); }
mengkompilasi apa adanya , bahkan jikafoo
tidak menyebutkan nama apa pun.Jawaban:
Ini ditafsirkan sebagai deklarasi fungsi bernama
a
, yang mengambil satu argumen tipeB
dan kembaliA
.sumber
A a{B};
Ini hanyalah deklarasi fungsi yang menyatakan
a
sebagai fungsi yang mengembalikanA
dan mengambil satu parameter tipe tanpa namaB
.Ini valid karena deklarasi fungsi yang bertentangan dengan definisi fungsi diizinkan dalam definisi fungsi.
sumber
Masalah ini dikenal sebagai parse yang paling menjengkelkan . Baris
A a(B);
dapat diartikan sebagai deklarasi fungsi yang bernamaa
mengembalikan objek tipeA
dan mengambil parameter tipe yang tidak disebutkan namanyaB
.Salah satu cara untuk menghindari masalah ini adalah dengan menggunakan sintaks inisialisasi seragam yang diperkenalkan dalam C ++ 11, yang terdiri dari penggunaan kurung kurawal alih-alih tanda kurung:
A a{B};
mengembalikan kesalahan. Baris sekarang ditafsirkan sebagai deklarasi variabel diinisialisasi denganB
, yang merupakan tipe, bukan nilai.Berikut informasi lebih lanjut:
The Most Vexing Parse: Cara Menemukan dan Memperbaikinya dengan Cepat
sumber
struct A { };
tidak valid dalam standar C, bahkan jika beberapa kompiler mengizinkannya. Jatuhkan kawat gigi dan tidak akan ada masalah di sana. Juga, di C, menyatakan atau mendefinisikanstruct A
tidak membuat nama jenisA
(Anda harus awalan denganstruct
, atau menambahkantypedef struct A A;
tempat sebelumA
digunakan tanpastruct
awalan). Juga di C, tidak ada alternatif parse ke deklarasi fungsi - menggunakantype name(...);
tidak bisa menjadi definisi variabel; selalu merupakan deklarasi fungsi (atau tidak valid). Kode dalam pertanyaan tidak valid dalam C.