Mengapa variabel enum merupakan nilai di sini?


12

Contoh:

typedef enum Color
{
    RED,
    GREEN,
    BLUE
} Color;

void func(unsigned int& num)
{
    num++;
}

int main()
{
    Color clr = RED;
    func(clr);
    return 0;
}

Saya mendapatkan kesalahan berikut ketika saya kompilasi ini:

<source>: In function 'int main()':

<source>:16:9: error: cannot bind non-const lvalue reference of type 'unsigned int&' to an rvalue of type 'unsigned int'

     func(clr);

         ^~~

Saya pikir variabel ( clr) yang saya berikan func(unsigned int&)adalah lvalue. Saya bisa mendapatkan alamat clrdan memberikan nilai lain untuk itu. Mengapa itu berubah menjadi nilai ketika saya mencoba meneruskannya func(unsigned int&)?


5
Tanyakan pada diri sendiri: Apakah enuma unsigned int?
— NathanOliver

@ NathanOliver-ReinstateMonica Menurut pendapat asli saya, saya pikir typedef enumini bukan tipe asli, dan C ++ akan memperlakukannya sebagai unsigned inttipe.
— Koen

1
Pesan kesalahan GCC adalah suboptimal dalam hal ini. Dentang akan memberikan pesan yang kurang membingungkan dengan mencetak jenis asli clr.
— cpplearner

@ cpplearner ya, itu sebabnya saya pikir enum typememperlakukan seperti unsigned intdi C ++.
— Koen

enum Xadalah tipe sendiri, berbeda dariint
— MM

Jawaban:


22

clritu sendiri adalah lvalue tipe Color. Tetapi fungsi tidak menerima a Color. Ia menerima (referensi ke) unsigned int. Jadi, argumennya dikonversi (secara implisit). Dan hasil konversi adalah nilai jenis unsigned int.


1
Yap, saya coba func(Color&)sebelum saya mengajukan pertanyaan, dan itu mengkompilasi lulus. Saya hanya berpikir C ++ akan memperlakukan enumtipe sebagai unsigned inttipe dalam kompilasi. Terima kasih atas jawaban anda.
— Koen

Satu hal yang menambah kebingungan adalah bahwa C hampir merupakan bagian sempurna dari C ++. Setidaknya, apa pun yang dapat Anda lakukan di C, Anda dapat melakukannya di C ++ dengan kode yang hampir identik, terutama pada gcc / dentang. Anda juga akan memerlukan konstruksi bergantung pada kompiler sebagai pengganti C ++ untuk 'pembatasan' dalam C yang disediakan oleh gcc. Enum berbeda dalam C dan C ++, misalnya, jika someColor adalah enum, 'someColor = 1' adalah legal C, tetapi bukan C ++.
— Erik Alapää

0

enum ketik init dan penugasan harus enum di dalam, jadi tipe enum tidak bisa bernilai rendah。 batal fungsi (unsigned int & num) fungsi ini perlu jenis kutipan


Jika saya berubah func(unsigned int&)menjadi func(Color&), kompilator menerimanya. Jadi saya pikir variabel tipe enum adalah nilai.
— Koen

tidak, karena tipe enum tidak dapat menetapkan int enum di luar
— superman

Maksudmu masih nilainya? Tapi saya mengikat referensi nilai tidak konstan untuk itu di func(Color&), dan lulus.
— Koen

ya, itu masih nilai, func (Warna & kunci) fungsi ini hanya fungsi param kunci RED, GREEN, BLUE, Kalau tidak, itu akan kesalahan。
— superman

Anda dapat melihat instruksi cpp ini
— superman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.